原始 | 盒装类型 | 原始/盒装的内存大小 |
---|---|---|
布尔值 | 布尔型 | 1字节/ 16个字节 |
字节 | 字节 | 1字节/ 16个字节 |
短 | 短 | 2个字节/ 16个字节 |
烧焦 | 烧焦 | 2个字节/ 16个字节 |
整型 | 整数 | 4字节/ 16字节 |
长 | 长 | 8个字节/ 16个字节 |
浮动 | 浮动 | 4字节/ 16字节 |
双 | 双 | 8个字节/ 16个字节 |
装箱的对象始终需要8个字节来进行类型和内存管理,并且由于对象的大小始终是8的倍数,所以装箱的类型都总共需要16个字节。在另外,盒装对象的每个的使用需要存储占另一个4或8个字节,这取决于JVM和JVM选项的参考。
在数据密集型操作中,内存消耗可能会对性能产生重大影响。使用数组时,内存消耗会增加更多:一个float[5]数组仅需要32个字节;而Float[5]存储5个不同的非空值将总共需要112个字节(在没有压缩指针的64位上,这将增加到152个字节)。
装箱类型的空间开销可以通过装箱值缓存来减轻。一些盒装类型实现实例的缓存。例如,默认情况下,Integer类将缓存实例的范围来表示数字-128到+127。但是,这并不能减少由于额外的内存间接而产生的额外费用。
如果通过自动装箱或调用静态valueOf(primitive)方法创建装箱类型的实例,则运行时系统将尝试使用缓存的值。如果您的应用程序在缓存范围内使用大量值,则可以大大减少使用盒装类型的内存损失。当然,如果要“手动”创建盒装值实例,则最好使用valueOf而不是new。(该new操作始终创建一个新实例。)但是,如果大多数值不在缓存范围内,则可以更快地调用new并保存缓存查找。