垃圾回收器总结 GC日志分析

来源:互联网 发布:生化危机4 mac 编辑:程序博客网 时间:2024/05/21 12:52

1、垃圾回收器种类
这里写图片描述

这里写图片描述
2、回收算法
标记–清除:
原理:内存进行GC时,先把需要回收的对象标记出来,然后删除对象
缺点:效率低,回收后内存不连续
这里写图片描述

标记–复制–清除:
原理:内存分为Eden+From+To=8:1:1,先标记需要回收的对象,然后把需要保留的对象复制到From区, 最后删除回收对象
优点:内存连续,适用于频繁回收对象,因此新生代堆回收一般使用此方法
这里写图片描述

标记–整理:
原理:先标记需要回收的对象,然后把保留的对象移动到界内,最后把界外的对象删除
优点:适用老年代,回收量大,但不频繁
这里写图片描述

3、标记算法(什么对象应该标记为需要回收)
a.引用计数法
一个对象创建后就开始计数,保存它被引用的次数,单次数记为0时,表示可回收
缺点:循环引用无法解决

b.GC Roots链
我们认为一个对象,只要被使用,那么就会存在一个类似树状的结构种,链接引用,当可回收时,此时的对象不会GC roots链表中,关键在于怎么确定根节点:
1):栈里面的对象:栈的对象是线程正在使用的对象,因此不可回收
2):方法区的静态变量:此时也不可回收
3):其他,如native方法正在使用的对象
只要不在上述对象的GC Roots链中的对象,我们就认为是可回收对象

4、GC回收器的结合种类
这里写图片描述
单–多:Serial + CMS
单–单:Serial + Serial Old
多–多:ParNew + CMS,Paralell Scavenge+parall old
多–单:ParNew + Serial old, Paralell Scavenge+ Serial old
注:单指单线程,多指多线程,只有一个并发CMS

5、GC日志分析:
下面是比较常见的日志内容:
这里写图片描述
420484.626***(JVM启动时间到目前的时间戳,秒): [GC [PSYoungGen(Parlell Scavenge GC): 1332969K->39723K(1335296K)(Eden+from回收前的内存大小—>回收后的大小(总大小含未使用))] 4084270K->2827467K(4131840K)(堆回收前大小–堆回收后大小(堆总大小含未使用)), 0.0851340 secs] [Times: user=0.24(回收线程执行用户代码CPU时间CPU个数,秒) sys=0.00*(回收线程执行Linux内核代码CPU时间CPU个数,秒), real=0.09 secs*(回收线程用来I/O阻塞等待时间,秒)*]

420484.712: [Full GC [PSYoungGen: 39723K->0K(1335296K)] [ParOldGen: 2787743K->2727423K(2796544K)] 2827467K->2727423K(4131840K) [PSPermGen: 62745K->62692K(262144K)], 1.8042640 secs] [Times: user=6.78 sys=0.00, real=1.80 secs]

6、基础知识
需要对JVM堆栈信息有些了解,记住堆主要是对象及数组
堆=new+old=Eden+From+To+old
java内存=堆+栈+方法区=java进程的大小,依据不同系统有所不同

原创粉丝点击