C++程序员不仅要关注业务逻辑还要关注内存管理
特点:
类比饭店:
自己吃饭自己擦桌子
类比饭店:
请一个服务员(JVM),专门擦桌子
发现无用对象---如何发现无用对象是个重点
引用计数法
原理如图:
每个对象加一个引用,被引用一次计数+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区
目标:
尽可能快速的收集掉那些生命周期短的对象
Eden满了以后触发Minor GC会清理年轻代的内存---算法过一遍所有的对象,无用的清除掉,算法采用效率较高的复制算法---有用的就复制到Survivor区(1区或者2区,对象再次满了以后查Survivor1区的,有用的放到Survivor2区,无用的清除,Eden里面有用的放到Survivor1区,无用的清除。当一个对象在Survivor1区2区反复横跳到15次以后放入Tenured/Old年老区。效率高但是会浪费内存空间。
年轻代区域存放满对象后会将对象放到年老代区域
特点:
在年轻代中经理了N(默认15)次垃圾回收后仍然存活的对象
生命周期长
数量多的时候要启动Major GC和Full GC(全量回收)---代价很高,性能消耗很高,全面清理年轻代区域和年老代区域对象
特点:
存放静态文件,Java类、方法等。
持久代堆垃圾回收没有显著影响
对象在它就在
示例图:
主要关注:
4.2Java垃圾回收机制(Garbage Collection)
原文:https://www.cnblogs.com/JunkingBoy/p/14613101.html