一、栈上的数据存储
(一)、概述
在32位虚拟机中,局部变量表中每个槽占32位,所以long和double类型的数都占据两个槽
在64位虚拟机中, 局部变量表中每个槽占32位,但是为了保证字节码的通用性,所以仍然占两个槽,内存空间为通用性做出了让步。
(二)、原理
堆->栈 : 补全
栈->堆 : 截断 boolean特殊,只取最后一位
二、对象在堆上是如何存储的?
(一)、对象在堆中的内存布局
(二)、指针压缩
在64位的Java虚拟机中,Klass Pointer以及对象数据中的对象引用都需要占用8个字节,为了减少这部分的内存使用量,64 位 Java 虚拟机使用指针压缩技术,将堆中原本 8个字节的指针压缩成 4个字节 ,此功能默认开启,可以使用-XX:-UseCompressedOops关闭。
问题:
- 需要进行内存对齐,指的是将对象的内存占用填充至8字节的倍数。存在空间浪费(对于Hotspot来说不存在,即便不开启指针压缩,也需要进行内存对齐)
- 寻址大小仅仅能支持2的35 次方个字节(32GB,如果超过32GB指针压缩会自动关闭)。不用压缩指针,应该是2的64次方 = 16EB,用了压缩指针就变成了8(字节) = 2的3次方 * 2的32次方 = 2的35次方
(三)、内存对齐
在Hotspot中,要求每个属性的偏移量Offset(字段地址 – 起始地址)必须是字段长度的N倍。
比如下图中,Student类中的id属性类型为long,那么偏移量就必须是8的倍数。
三、方法调用的原理
(一)、静态绑定
(二)、动态绑定
四、异常捕获的原理
finally
五、JIT即时编译器
(一)、简介
(二)、方法内联
(三)、逃逸分析
(四)、总结
六、垃圾回收器原理
(一)、G1
1、年轻代回收
2、混合回收
(二)、ZGC
(三)、ShenandoahGC