Java图元与盒装图元的内存消耗

示例

原始盒装类型原始/盒装的内存大小
布尔值布尔型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并保存缓存查找。