3 回答
TA贡献1799条经验 获得超6个赞
JVM可以随心所欲地以任何方式存储数据,无论是大端还是小端,有任何数量的填充或开销,尽管原语的行为必须像它们具有官方大小一样。 例如,jvm或本机编译器可能决定存储 boolean[]
在64位长的块中,就像 BitSet
..只要程序给出相同的答案,它就不必告诉你。
它可能会在堆栈上分配一些临时对象。 它可以优化某些变量或方法调用完全不存在,用常量替换它们。 它可以对方法或循环进行版本化,即编译一个方法的两个版本,每个版本都针对特定的情况进行优化,然后预先决定要调用哪个版本。
当然,硬件和操作系统都有多层缓存,芯片缓存、SRAM缓存、DRAM缓存、普通RAM工作装置和磁盘上的备份存储。您的数据可能在每个缓存级别重复。所有这些复杂性意味着您只能非常粗略地预测RAM的消耗。
测量方法
Instrumentation.getObjectSize()
对象头和对象引用
-Xmx32G
-Xmx32G
).
装箱类型、数组和字符串
Integer
:16字节的结果比我预期的要差一点,因为 int
值只能容纳4个额外字节。使用 Integer
与将值存储为基元类型相比,占用300%的内存开销。
Long
16字节:很明显,堆上的实际对象大小取决于特定CPU类型的特定JVM实现所做的低级别内存对齐。看上去像是 Long
是8字节的对象开销,加上实际长值的8字节。相反, Integer
有一个未使用的4字节洞,很可能是因为我使用的JVM在一个8字节的单词边界上强制对象对齐。
多维阵列
它提供了另一个惊喜。 开发人员通常使用类似于 int[dim1][dim2]
在数值和科学计算方面。
在 int[dim1][dim2]
数组实例,每个嵌套 int[dim2]
数组是 Object
以它自己的权利。每个数组都增加了通常的16字节数组开销。当我不需要一个三角形或粗糙的数组时,这代表了纯粹的开销。当数组尺寸相差很大时,影响会增大。
例如, int[128][2]
实例需要3600字节。与1,040字节相比, int[256]
实例使用(具有相同的容量),3,600个字节表示246%的开销。在极端情况下 byte[256][1]
,开销因素几乎是19!将其与C/C+的情况进行比较,在这种情况下,相同的语法不会增加任何存储开销。
String
*a String
内存增长跟踪其内部char数组的增长。 String
类添加另24个字节的开销。
对于一个非空的人 String
在大小为10个或更小的字符中,所增加的开销相对于有用的有效负载(每个字符为2个字节,长度为4个字节),从100%到400%不等。
对齐
class X { // 8 bytes for reference to the class definition int a; // 4 bytes byte b; // 1 byte Integer c = new Integer(); // 4 bytes for a reference}
X
TA贡献1816条经验 获得超6个赞
Running 64-bit HotSpot VM.Using compressed oop with 3-bit shift.Using compressed klass with 3-bit shift.Objects are 8 bytes aligned .Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]java.lang.Integer object internals: OFFSET SIZE TYPE DESCRIPTION VALUE 0 12 (object header) N/A 12 4 int Integer.value N/AInstance size: 16 bytes (estimated, the sample instance is not available)Space losses: 0 bytes internal + 0 bytes external = 0 bytes total
import org.openjdk.jol.info.ClassLayout;import org.openjdk.jol.util.VMSupport;public static void main(String[] args) { System.out.println(VMSupport.vmDetails()); System.out.println(ClassLayout.parseClass(Integer.class).toPrintable());}
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.3.2</version></dependency>
添加回答
举报