请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

海外回流 浦志强案 一次 JVM FullGC 的排查过程及解决方案 天涯明月刀小说下载 guguo

[复制链接]
查看: 574|回复: 0

52

主题

219

帖子

325

积分

等待验证会员

积分
325
发表于 2019-6-11 13:02 | 显示全部楼层 |阅读模式
这是写在帖子头部的内容接待关注头条号:石杉的架构笔记
周一至周五早八点半!佳构技术文章定时送上!!!
佳构进修材料获得通道,拜见文末
本文来历:字节观,是二阿公同学的投稿


题目发生
比来新上线的系统偶然会报FullGC时候太长(>1s)的告警,检察GC日志,以下图所示:


看到GC日志,我第一时候关注到的不是GC耗时,而是GC触发的缘由:Metadata GC Threshold
也就是 FullGC 触发的缘由是由于Metaspace巨细到达了GC阈值。在监控系统里面看了一下Metaspace的巨细变化趋向,以下图所示:


依照以往的经历,Metaspace在系统稳定运转一段时候后占用空间应当比力稳定才对,可是从上图来看,Metaspace明显是显现大幅波动。为什么呢?
相关常识
我们晓得Metaspace首要存储类的元数据,比如我们加载了一个类,那末这个类的信息就会依照一定的数据结构存储在Metaspace中。
Metaspace的巨细和加载类的数目有很大关系,加载的类越多,Metaspace占用内存也就越大。
Metaspace被分派于堆外空间,默许最大空间只受限于系统物理内存。跟它相关的比力重要的两个JVM参数:

DXCPICKPRE_0</pre>MaxMetaspaceSize,大师从名字也能猜到是指Metaspace最大值。
而MetaspaceSize能够就比力轻易让人误解为是Metaspace的最小值,实在它是指Metaspace扩容时触发FullGC的初始化阈值。
在GC后Metaspace会被静态调剂:假如本次GC开释了大量空间,那末就适当下降该值,假如开释的空间较小则适当进步该值,固然它的值不会大于MaxMetaspaceSize.
别的一个相关常识是:Metaspace中的类需要满足什么条件才可以被当做渣滓被卸载接管?
条件还是比力严苛的,需同时满足以下三个条件的类才会被卸载:

  • 该类一切的实例都已经被接管;
  • 加载该类的ClassLoader已经被接管;
  • 该类对应的java.lang.Class工具没有任何地方被援用。


排查进程
我们可以回过甚再细看GC日志,可以看出Metaspace已利用内存在FullGC后明显变。372620K -> 158348K),说明Metaspace经过FGC后卸载了很多类。
从这点来看,我们有来由思疑系统能够在频仍地天生大量”一次性“的类,致使Metaspace所占用空间不竭增加,增加到GC阈值后触发FGC。




那末这些被接管的类是什么呢?
为了弄清楚这点,我增加了以下两个JVM启动参数来观察类的加载、卸载信息:

DXCPICKPRE_1</pre>

加了这两个参数后,系统跑了一段时候,从Tomcat的catalina.out日志中发现大量以下的日志:






到此根基可以肯定Metaspace增加的首恶是这些类,那末这些类
sun.reflect.GeneratedSerializationConstructorAccessorXXX
是干嘛的呢?又是从那里引进来的呢?我也是一脸懵逼~~
按照类名Google了一把,找到了@寒泉子写的《从一路GC血案谈到反射道理》,这篇文章对这些类的来历诠释得很透彻。在这里我简单总结以下:

DXCPICKPRE_2</pre>这些类的来历是反射,类似上面所示的反射代码应当大师都写过大概看过,我们常用的大大都框架比如Spring、Dubbo等都大量利用反射。
出于性能的斟酌,JVM会在反射代码履行一定次数后,经过静态天生一些类来将”反射挪用”变成“非反射挪用”,以到达性能更好。而这些静态天生的类的实例是经过软援用SoftReference来援用的。
我们晓得,一个工具只要软援用SoftReference,假如内存空间不敷,就会接管这些工具的内存;假如内存空间充足,渣滓接管器不会接管它。只要渣滓接管器没有接管它,该工具便可以被利用。
那末,究竟在什么时辰会被接管呢?
SoftReference中有一个全局变量clock代表最初一次GC的时候点,有一个属性timestamp,每次拜候SoftReference时,会将timestamp其设备为clock值。
当GC发生时,以下几个身分影响SoftReference援用的工具能否被接管:

  • SoftReference工具实例多久未拜候,经过clock - timestamp得出工具大要有多久未拜候;
  • 内存余暇空间的大。
  • SoftRefLRUPolicyMSPerMB常量值;


能否保存SoftReference援用工具的判定参考表达式,true为不接管,false为接管:

DXCPICKPRE_3</pre>说明:

  • clock - timestamp:最初一次GC时候和SoftReference工具实例timestamp的属性的差。就是这个SoftReference援用工具大要有多久未拜候过了
  • freespace:JVMHeap中余暇空间大,单元为MB。
  • SoftRefLRUPolicyMSPerMB:每1M余暇空间可连结的SoftReference工具保存的时长(单元ms)。这个参数就是一个常量,默许值1000,可以经过参数:-XX:SoftRefLRUPolicyMSPerMB停止设备。


检察了一下我们系统的JVM参数设置,发现我们把SoftRefLRUPolicyMSPerMB设备为0了,这样就致使软援用工具很快就被接管了。进而致使需要频仍重新天生这些静态类。
为了考证这个猜测,我把SoftRefLRUPolicyMSPerMB改成了6000停止观察,发现公然猜得没错。
系统启动后未几Metaspace的利用空间根基连结稳定了,运转几天后也没再出现由于Metaspace巨细到达阈值而触发FGC。至此题目处理。
References
假笨说-从一路GC血案谈到反射道理:
https://mp.weixin.qq.com/s/5H6UHcP6kvR2X5hTj_SBjA?
Java的强援用,软援用,弱援用,虚援用及其利用处景:
http://blogxin.cn/2017/09/16/java-reference/
END
一大波微办事、散布式、高并发、高可用的原创系列文章正在路上,
接待关注头条号:石杉的架构笔记
周一至周五早八点半!佳构技术文章定时送上!!!
十余年BAT架构经历倾囊相授
保举阅读
1、
2、
3、
4、
5、
6、
7、
8、
9、
10、
11、
12、
13、
14、
15、
16、
17、
18、
19、
20、
21、
22、
23、
24、
25、
26、
27、
28、
29、
30、
31、
32、
33、
34、
35、
36、
37、
38、
39、
40、
41、
42、
43、
44、
45、
46、
47、
48、
49、
50、
51、
52、
53、
54、
55、
56、
57、
58、
59、
60、
61、
62、
63、
64、
65、
66、
67、
67、
68、
69、
70、
71、
72、
73、
74、
75、
76、
77、
78、
79、
80、

感激您的阅读

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
[url=https://vkladovke.com.ua/g3901783-lodki-naduv
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 分享健康养生攻略,让生活更健康-乐哈健康网 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表