4.2Java垃圾回收机制(Garbage Collection)
Java垃圾回收机制与C++垃圾回收机制的对比
C++程序员不仅要关注业务逻辑还要关注内存管理
C++垃圾回收
特点:
类比饭店:
-
自己吃饭自己擦桌子
Java垃圾回收
类比饭店:
-
请一个服务员(JVM),专门擦桌子
Java垃圾回收过程
-
发现无用对象---如何发现无用对象是个重点
-
引用计数法
-
原理如图:
-
每个对象加一个引用,被引用一次计数+1,通过对象是否被引用判断对象是否是垃圾
-
缺点
-
遇见循环引用就会出现问题
-
实例题:
-
/**
* 垃圾回收算法循环引用机制
* @author Lucifer
*/
public class StudentNo3 {
//定义一个成员变量
String name;
//
StudentNo3 friend;
public static void main(String[] args) {
StudentNo3 s1 = new StudentNo3();
StudentNo3 s2 = new StudentNo3();
s1.friend = s2;
s2.friend = s1;
s1 = null;
s2 = null;
//System.gc(); //向系统发出了一个请求,能否调GC,至于调用还是不调用由系统决定
}
} -
示例图:
-
-
-
引用可达法(根搜索算法)
-
用算法跟踪节点
-
-
-
回收无用对象占用的内存空间
通用的分代垃圾回收机制
本质:将对象进行分类,不同对象的生命周期是不一样的
年轻代(Eden Survivor)
年老代(Tenured/Old)
持久代
年轻代(Eden Survivor)
特点:
-
新生成的对象首先都是放在Eden区
目标:
-
尽可能快速的收集掉那些生命周期短的对象
-
Eden满了以后触发Minor GC会清理年轻代的内存---算法过一遍所有的对象,无用的清除掉,算法采用效率较高的复制算法---有用的就复制到Survivor区(1区或者2区,对象再次满了以后查Survivor1区的,有用的放到Survivor2区,无用的清除,Eden里面有用的放到Survivor1区,无用的清除。当一个对象在Survivor1区2区反复横跳到15次以后放入Tenured/Old年老区。效率高但是会浪费内存空间。
-
年轻代区域存放满对象后会将对象放到年老代区域
年老代(Tenured/Old)
特点:
-
在年轻代中经理了N(默认15)次垃圾回收后仍然存活的对象
-
生命周期长
-
数量多的时候要启动Major GC和Full GC(全量回收)---代价很高,性能消耗很高,全面清理年轻代区域和年老代区域对象
持久代
特点:
-
存放静态文件,Java类、方法等。
-
持久代堆垃圾回收没有显著影响
-
对象在它就在
示例图:
JVM调节
主要关注: