GC【垃圾回收】
heap + metaspace
1.什么是垃圾?
没有引用指向的对象
GC:
一、哪些对象要被回收 which
二、什么时候被回收 when
三、采用什么方式回收 how
一、哪些对象要被回收 which(没有被调用的对象)
1.引用计数法【了解】
给对象添加了一个引用计数器,引用一次 +1 引用失效 -1
计数器0 说明这个对象可以被回收 (对象“已死”)
缺点:
循环引用 ,会导致 这个对象回收不了 (以下是例子,说明一下)
Obejcet a = new Object(); +1(被引用后+1)
Obejcet b = new Object(); +1
a.xxx=b +1
b.xxx=a +1
a.xxx=b +1
a =>2
b =>3
a=null a =>1
b=null b =>2
2.根节点可达性分析
以“GCroot”作为起始点,从这些结点开始向下搜索,搜索所走到的路径称为(引用链),当一个对象到GCroot没有任何引用链时,则证明此对象是不可用的(被回收)。
什么是GCroot?(是一个根对象,可以是方法区中类静态属性引用的对象,也可以是常量引用的对象等如下所示:)
1.栈
2.方法区
3.native stack
二、采用什么方式回收?when +how
1.理论:=》 gc算法
2.落地:=》垃圾收集器
gc算法:
1.标记清除: mark-sweep (效率更高)
标记: 标记哪些对象要被清除【根节点可达性分析】
清除:垃圾对象进行清除
缺点: 内存碎片
stop the world =》 stw 暂停应用
2.标记整理:
标记: 标记哪些对象要被清除【根节点可达性分析】 进行清除
整理:移动活的对象 进行内存整理
3.复制:(内存浪费比较多)
1.把内存分成大小相同的两片
2.浪费了一些内存
3.没碎片
对象:
夭折:90%
老不死的:old 0-15(默认的,最好不要修改) 15 这个对象是足够的老
不灭的:class 、pool
年轻代参数:
-Xmnsize =》 年轻代
XX:SurvivorRatio=ratio =》 8:1:1
垃圾收集器 :
1.串行垃圾收集器
2.并行垃圾收集器
3.并发垃圾收集器
4.G1垃圾收集器【比较复杂】
1.串行垃圾收集器
1.一个线程处理垃圾回收
2.stw
app=>gc=>app
2.并行垃圾收集器
1.多个线程处理垃圾回收
2.比 串行垃圾收集器 stw时间短
3.并发垃圾收集器
你的程序线程 和 gc线程 并发执行
没有stw
分代算法:
年轻代 老年代
1.年轻代
1.年轻代:串行
-Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseSerialGC
DefNew 年轻代 串行垃圾回收器
Tenured 老年代 串行垃圾回收器打印
2.年轻代:ParNew(并行)
-Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseParNewGC
ParNew 年轻代 并行垃圾回收器
Tenured 老年代 串行垃圾回收器打印
3.年轻代:Parallel Scavenge(并发) jinfo
-Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseParallelGC
PSYoungGen 年轻代 并发垃圾回收器
ParOldGen 老年代 并行垃圾回收器
注意:
可以从单单 一个方面入手 eg:年轻代 老年代的gc 就确定了
2.老年代
1.老年代:串行 【用不了】(在Java源代码中找不到,说明老年代的串行匹配不到年轻代的垃圾回收器)
-Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseSerialOldGC【参数没有找到】
2.老年代:Parallel old(并行)
-Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseParallelOldGC
PSYoungGen 年轻代 并发垃圾回收器
ParOldGen 老年代 串行垃圾回收器打印
3.CMS(并发标记清除)
1.目的
gc =》 停顿的时间比较短
-Xms5m -Xmx5m -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC
ParNew 年轻代 并发垃圾回收器
CMS 老年代 cms垃圾回收器