Java垃圾回收机制
- 垃圾回收算法
- 为什么垃圾回收
- 回收哪些内存
- 如何回收
- Marking-Sweep(标记-清除法)
- Marking-Compat(标记-整理法)
- 内存分代
- 年轻代
- Minor gc和Major gc的区别
- 常见回收器
- Serial Garbage Collector
- Parallel Garbage Collector
- CMS Garbage Collector
- G1 Garbage Collector
垃圾回收算法
为什么垃圾回收
方便程序员写代码的时候,管理内存。有了这个自动的垃圾回收机制,不需要手动地分配内存和回收内存。这些JVM已经完成。
回收哪些内存
使用可达性分析算法。每个对象都有自己的引用。没有被GC Roots引用的对象都是可以被回收的对象。
根对象包括哪些:
- 虚拟机栈中的引用的对象
- 方法区中的类静态属性引用的对象
- 方法区中的常量引用的对象
- 本地方法栈中JNI(Native方法)的引用的对象。
如何回收
Marking-Sweep(标记-清除法)
会产生碎片,可能造成内存不足的问题。
Marking-Compat(标记-整理法)
内存分代
老年代,空间比较大,主要存放一些比较老的对象。
方法区主要存放一些常量和一些静态属性。
内存分配的第一个代会分配到年轻代中。
分代的原因是因为对象的生命周期不同。
年轻代
S1区也称为from区,S2区也称为to区。
首先会在Eden区进行分配,如果空间不足的话,会将Eden中的对象放入到S0中,并且将他们的年龄置为1(1岁):
如果S0中内存区域不足的话,会将S0中的对象放到S1中去,且年龄增加一岁,变成2(2岁):
下一次则从S1中回到S0, 年龄又加1,不停地交换移动。
达到一定年龄后停止,例如8后,则放到老年中,变成9:
Minor gc和Major gc的区别
老年代回收频率比较低,不如年轻代,年轻代中多是朝生夕死的对象。老年代中存放的对象多是年龄比较高而且比较大的对象。老年代回收称为Major gc。
常见回收器
Serial Garbage Collector
单线程GC
Parallel Garbage Collector
多线程GC
CMS Garbage Collector
多线程GC
G1 Garbage Collector
jdk7引进GC,多线程,高并发,低延迟。逐步取代CMS GC。
参考资料:【Java面试题】Java垃圾回收机制