1.内存结构
如下图所示
- 堆上分配
大多数情况在Eden上分配,偶尔直接在Old上分配
其细节取决于GC的实现 - 栈上分配
原子类型的局部变量
2 内存回收
2.1 引用类型
GC要做的是将那些消亡对象所占用的内存回收掉
- Hotspot认为没有引用的对象是消亡的
- Hotspot将引用分为四种
- Strong—强引用
即默认通过Object obj = new Object
这种方式赋值的引用 - Sotf—软引用
- Weak—弱引用
- Phantom—虚引用
- Strong—强引用
Sotf,Weak,Phantom这个三种都是继承Reference
2.1 内存回收
在Full GC
会对Reference类型的引用进行特殊处理
- Soft—内存不够时一定会被GC,长期不用一定会被GC
- Weak—一定会被GC,当标记为消亡时,会在ReferenceQueue中通知
- Phantom—本来就没引用,当前JVM 堆中释放时会通知
3 空间分配担保
在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象的总空间,如果这个条件成立,那么Minor GC可以确保是安全的
当大量对象在Minor GC后仍然存活,就需要老年代进行空间分配担保,把Survivor无法容纳的对象直接进入老年代
如果老年代判断剩余空间不足(根据以往每一次回收晋升到老年代对象容量的平均值作为经验),则进行一次Full GC