对象的内存模型,对象的内存分配流程
2021-07-14 11:47:06 3 举报
RT
作者其他创作
大纲/内容
N
内存分配开始
1.Mark Word字段(32位系统下4字节,64位下8字节)。自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等2.Klass Pointer。指向方法区中,它的类元信息,由此JVM可以确定他的实现类3.数组长度(只有数组对象才有)
OLD老年区分配
栈内分配内存?
为了减少对象在堆内存中的分配数量(目的是为了减少GC压力),JVM会通过逃逸分析决定一个对象是否要在栈内分配,这样,对象就会随着栈帧的出栈入栈销毁而销毁。PS:逃逸分析:即分析对象的动态作用域是否只在一个局部内,不会被外部引用。其中逃逸分析这个概念又涉及到另一个东西,标量替换。标量替换:通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时,JVM不会创建该对象,而是将该对象成员变量分解若干个被这个方法使用的成员变量所代替,这些代替的成员变量在栈帧或寄存器上分配空间,这样就不会因为没有一大块连续空间导致对象内存不够分配。
栈内分配
Y
大对象?
EDEN区分配
对象头
对齐填充
EDEN区空间足够?
跟C语言结构体的内存对齐一样。这是因为,计算机对2^n地址检索效率比较高
对象的内存模型
OLD区空间足够?
FULL-GC(清理老年代,有一些垃圾收集器FULL-GC又是指清理了整个堆内存)
MINOR-GC/YOUNG-GC清除新生代内存空间
内存分配结束
实例数据
0 条评论
下一页