1.JVM堆内存示意图(JDK1.8前) JDK1.8(包含)后永久代改为原空间不在占用JVM堆内存,而是使用了物理内存。 2.JVM为什么要进行垃圾回收? 如果不进行垃圾回收,内存迟早都会被消耗空,因为
1.JVM堆内存示意图(JDK1.8前)
JDK1.8(包含)后永久代改为原空间不在占用JVM堆内存,而是使用了物理内存。
2.JVM为什么要进行垃圾回收?
如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。
GC是垃圾收集的意思(Gabage Collection),Java提供的GC功能可以自动也只能自动地回收堆内存中不再使用的对象,释放资源(目的),Java语言没有提供释放已分配内存的显式操作方法(gc方法只是通知,不是立即执行)。对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,当一个对象不再被引用的时候,按照特定的垃圾收集算法来实现资源自动回收的功能。3.垃圾回收算法有哪些?区别是什么?
复制算法:效率高,但空间使用率有限并且GC执行过程包含了压缩,所以不存在内存碎片化问题
标记-清除:内存使用率提升,但是内存碎片化严重
标记-整理:内存使用率提升,不存在内存碎片化,但是解决碎片化问题需要多次遍历内存进行合并故效率低下
4.垃圾回收器有哪些?区别是什么?
5.如何选择垃圾回收器?
6.最近一次JVM调优案例分析记录
背景:(刷脸、入网时传输图片)公司文件上传系统商户反应响应时间较长,平均10s左右
分析:配合各个部门进行排查,网络、运维(机器、硬件等),监控JVM GC运行情况后发现FULL GC时间过长平均在10s-15s左右
问题:线上环境jdk1.7,垃圾回收使用paraller scavenge(简称PS,吞吐量优先),开启动态内存分配,整堆内存32G,分配比例1:3,监控线上运行情况发现在早上10-12,下午14-16点为高峰期,大量请求打进导致endn区,由于开启动态分配内存(猜测JVM来不及反应当前这一笔)发生yong gc时导致S0或S1内存不够,导致全部打进老年代,PS在进行垃圾回收时回停止用户线程,由于分配内存较大导致回收时间长。
方案1:更改垃圾回收器(老年代使用CMS、年轻代使用parNew),重新分配内存及新生代S区比例(1:1,6:1:1),观察一段时间发现full gc比原来缩小15倍左右,但是yong gc在原来基础上增加0.4秒(原因:原新生代分配内存10G左右,改造完后分配了16G,由于内存增加导致回收时间变慢),S0或S1区即使发生yong gc进行交换后活跃对象还占用60%(猜测可能是因为副本同步导致对象还被占用无法释放)
方案2:更改垃圾回收器(老年代使用CMS、年轻代使用parNew),重新分配内存及新生代S区比例(1.5:1.5,6:1:1)