ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JVM中FGC和YGC分析

2021-10-29 00:01:58  阅读:773  来源: 互联网

标签:YGC GC 内存 JVM gc FGC


1. YGC和FGC说明:

YGC :对新生代堆进行gc。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。

FGC :全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发fgc。以我们生产环境为例,一般比较少会触发fgc,有时10天或一周左右会有一次。

2. YGC和FGC执行时机:

a.edn空间不足,执行 young gc

b.old空间不足,perm空间不足,调用方法System.gc() ,ygc时的悲观策略, dump live的内存信息时(jmap –dump:live),都会执行full gc。

3,JVM内存空间设置:

JVM内存设置越大,fgc耗时越长,并非越大越好。一般JVM配置的内存越想,fgc时间越短,1G>2G>3G。

4,GC影响:

GC耗时太长、GC次数太多会影响进程的性能,导致进程响应变慢,或者无法响应。

FGC正常次数:越少越好。比较正常情况几个小时一次、或者几天才一次。

FGC耗时:耗时很长会导致线程频繁被停止,使应用响应变慢,比较卡顿。

YGC耗时:耗时在几十或者几百毫秒属于正常情况,用户几乎无感知,对程序影响比较少。耗时太长或者频繁,会导致服务器超时问题。

YGC次数:太频繁,会降低服务的整体性能。高并发服务时,影响会比较大。

5,FGC出现常见原因:

1,大对象:系统一次性加载了过多数据到内存中(比如SQL查询未做分页),导致大对象进入了老年代。

2,内存泄漏:频繁创建了大量对象,但是无法被回收(比如IO对象使用完后未调用close方法释放资源),先引发FGC,最后导致OOM.

3,程序频繁生成一些长生命周期的对象,当这些对象的存活年龄超过分代年龄时便会进入老年代,最后引发FGC. (即本文中的案例)

4,程序BUG导致动态生成了很多新类,使得 Metaspace 不断被占用,先引发FGC,最后导致OOM. 代码中显式调用了gc方法,包括自己的代码甚至框架中的代码。

5,JVM参数设置问题:包括总内存大小、新生代和老年代的大小、Eden区和S区的大小、元空间大小、垃圾回收算法等等。

6,定位工具

JDK的自带工具,包括jmap、jstat等常用命令:

1, 查看堆内存各区域的使用率以及GC情况

jstat -gcutil -h20 pid 1000

2,查看堆内存中的存活对象,并按空间排序

jmap -histo pid | head -n20

3, dump堆内存文件

jmap -dump:format=b,file=heap pid

7, 堆内存结构:

GC分为YGC和FGC,它们均发生在JVM的堆内存上。先来看下JDK8的堆内存结构:

堆内存采用了分代结构,包括新生代和老年代。

新生代又分为:Eden区,From Survivor区(简称S0),To Survivor区(简称S1区),三者的默认比例为8:1:1。

新生代和老年代的默认比例为1:2。堆内存之所以采用分代结构,是考虑到绝大部分对象都是短生命周期的,这样不同生命周期的对象可放在不同的区域中,然后针对新生代和老年代采用不同的垃圾回收算法,从而使得GC效率最高。

标签:YGC,GC,内存,JVM,gc,FGC
来源: https://blog.csdn.net/qq_42158153/article/details/121025976

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有