其他
拉勾一面:new Object()到底占用几个字节?我:没这么欺负人的~
点击关注下方公众号,Java面试资料 都在这里
# 前言
# 对象的指向
package com.zwx.jvm;
public class HeapMemory {
private Object obj1 = new Object();
public static void main(String[] args) {
Object obj2 = new Object();
}
}
# Java内存模型
Object obj=new Object()占用字节
未开启指针压缩 占用大小为:8(Mark Word)+8(Class Pointer)=16字节
开启了指针压缩(默认是开启的) 开启指针压缩后,Class Pointer会被压缩为4字节,最终大小为:8(Mark Word)+4(Class Pointer)+4(对齐填充)=16字节
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
package com.zwx.jvm;
import org.openjdk.jol.info.ClassLayout;
public class HeapMemory {
public static void main(String[] args) {
Object obj = new Object();
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
}
}
-XX:+UseCompressedOops 开启指针压缩
-XX:-UseCompressedOops 关闭指针压缩
package com.zwx.jvm;
public class MyItem {
byte i = 0;
}
package com.zwx.jvm;
import org.openjdk.jol.info.ClassLayout;
public class HeapMemory {
public static void main(String[] args) {
MyItem myItem = new MyItem();
System.out.println(ClassLayout.parseInstance(myItem).toPrintable());
}
}
# 对象的访问
句柄访问,使用句柄访问的话,Java虚拟机会在堆内划分出一块内存来存储句柄池,那么对象当中存储的就是句柄地址,然后句柄池中才会存储对象实例数据和对象类型数据地址。 直接指针访问(Hot Spot虚拟机采用的方式) 直接指针访问的话对象中就会直接存储对象类型数据。
句柄访问和直接指针访问对比
# 堆内存
Young区
Old区
名词扫盲
垃圾回收:简称GC。 Minor GC:针对新生代的GC Major GC:针对老年代的GC,一般老年代触发GC的同时也会触发Minor GC,也就等于触发了Full GC。 Full GC:新生代+老年代同时发生GC。 Young区:新生代 Old区:老年代 Eden区:暂时没发现有什么中文翻译(伊甸园?) Surcivor区:幸存区 S0和S1:也称之为from区和to区,注意from和to两个区是不断互换身份的,且S0和S1一定要相等,并且保证一块区域是空的