JVM对象创建
2021-10-16 18:43:21 1 举报
JVM对象创建
作者其他创作
大纲/内容
1、指针碰撞2、空闲列表
否
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。new指令对应到语言层面上讲是,new关键词、对象克隆、对象序列化等。
为什么要进行指针压缩?1.在64位平台的HotSpot中使用32位指针,内存使用会多出1.5倍左右,使用较大指针在主内存和缓存之间移动数据,占用较大宽带,同时GC也会承受较大压力2.为了减少64位平台下内存的消耗,启用指针压缩功能3.在jvm中,32位地址最大支持4G内存(2的32次方),可以通过对对象指针的压缩编码、解码方式进行优化,使得jvm只用32位地址就可以支持更大的内存配置(小于等于32G)4.堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址,即使用低虚拟地址空间5.堆内存大于32G时,压缩指针会失效,会强制使用64位(即8字节)来对java对象寻址,这就会出现1的问题,所以堆内存不要大于32G为好
不开启压缩
低32位能表示的内存大小是2的32次方,也就是说是4G,那么假如我们要表示16G怎么表示呢,其实就是2的34次方,也就是说我们要占用2位高位,但是JVM系统会进行指针压缩,也就是说保证只占用低32位,但是内存大小是16G
CAS
开启压缩
是
加载类
如图,这个五角星标记的就是一个指针,它是按照你的对象的大小进行按序分配内存的,每分配一块内存,指针就向后移动一个对象内存的大小
TLAB就是在eden区提前划分一个小的空间,来存放这些对象。通过XX:+/UseTLAB参数来设定虚拟机是否使用TLAB(JVM会默认开启XX:+UseTLAB),XX:TLABSize 指定TLAB大小。
类加载检查
Object对象头
设置对象头
32位(高)
是否加载
空闲列表就是将内存中没有使用过的内存地址放到一个空闲列表中进行维护
....
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时 间戳等。对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
对齐填充Padding(保证对象是8个字节的整数)
实例数据(Instance data)
线程B
初始化
32位(低)
...
对变量进行初始化,如果是int类型就初始化为0,如果是对象类型的,就初始化为null
.................
执行<init>方法,为属性赋值(注意,这与上面的赋零值不同,这是由程序员赋的值),和执行构造方法。
Object
分配内存
什么是java对象的指针压缩?1.jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩2.jvm配置参数:UseCompressedOops,compressed压缩、oop(ordinary object pointer)对象指针3.启用指针压缩:XX:+UseCompressedOops(默认开启),禁止指针压缩:XX:UseCompressedOops
线程A
执行<init>方法
0 条评论
下一页