正文
一次ygc越来越慢的问题排查过程
原
荐
字数 1975
阅读 2
收藏 0
Nashorn Java JDK
开发十年,就只剩下这套架构体系了! >>>
某天突然收到线上应用的gc时间过长的告警,刚开始只有一台机器偶尔报一下,后续其他机器也纷纷告警,具体告警的阈值是应用10分钟内ygc的总时长达到了6.6s。
-XX:+PrintReferenceGC
参数,经过一段时间观察,应用重启后,观察了一段时间,发现gc日志中JNI Weak Reference处理时长变得越来越长。而且占用整个ygc时长的大部分。 jdk.nashorn.internal.ir.IdenNode
通过引用链找到可疑的js脚本对应的 String
,尝试了很多次发现都失败了。主要本身对 jdk.nashorn
包下类不是很熟悉,再加上引用链都比较长,所以找了很久都没有找到这个类和脚本的应用关系。 String
对象存在, String
底层采用 char[]
来存储字符。所以直接找 char[]
实例中内容为js脚本的,但是这里又遇到一个问题,看上面的dump文件图,会发现 char[]
实例数当前内存有100w+,这里就抓住了部分js脚本长度比较长的一个特点。直接根据size正序排列,长度前10的字符串,就直接就找到了一个脚本,顺着引用链会轻易发现,js脚本的内容都是保存在 Source$RawData
对象中的,如下图 Classes
栏目,直接搜索 Source$RawData
,可以看到有241个实例,如下图 ,这241个,然后找了出现频率比较高的几个js脚本,然后看了对应脚本的调用方式,发现其中一个脚本每次执行都是通过 ScriptEngine.eval
这种方式来执行,就造成了``JNIHandleBlock```,不断增长的问题,最终导致ygc时,处理JNI Weak Reference的时间越来越长。 eval
方法,换成Bindings的方式调用。 -Xms4000m -Xmx4000m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:MaxDirectMemorySize=512m -XX:+UseCMSInitiatingOccupancyOnly -XX:SurvivorRatio=8 -XX:+ExplicitGCInvokesConcurrent -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:-OmitStackTraceInFastThrow -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/www/logs/gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/www/logs -Djava.io.tmpdir=/var/www/tmp -Dio.netty.availableProcessors=4 -XX:ParallelGCThreads=4 -Dpinpoint.applicationName=crawler-worker.product-bank
这样,其中 -Xms4000m
是初始化堆大小, -Xmx4000m
是最大堆大小,然后重启应用,重启后,就收到ygc频繁的告警,然后用 jstat -gc pid 3000
看了下,发现了奇怪的地方(如下图) 年轻代总容量才300多m(S0C+S1C+EC),而年老大总容量(OC)有3700多m,这种情况就直接导致了,直接分配对象空间的eden区域很容易就占满了,而直接触发ygc,而导致这个问题的原因呢,是忘记配置 -Xmn1024m
参数导致,这个参数就是制定年轻代的大小,这里的大小配置成整个堆的1/4至1/2都是合理的,加上这个参数后,刚启动应用就ygc时间过长的问题就得到了解决。 版权声明 作者:wycm
出处: https://my.oschina.net/wycm/blog/3023965
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
© 著作权归作者所有
共有人打赏支持
上一篇: 无界面Ubuntu服务器搭建selenium+chromedriver+VNC运行环境
下一篇: 一次频繁Full GC问题排查过程分享
粉丝 2
博文 10
码字总数 17850
作品 0
成都
提问相关文章 最新文章
问题描述: 生产环境上线堡垒机后,使用2008R2作为应用发布服务器,提供一些windows程序应用服务。使用一段时间后,发现远程桌面会话打开越来越慢,在服务器上上传下载速度也越来越慢。 临时...
FJCA
2018/08/10
0
0
阅读本文可以带着下面问题: 1.HBase遇到问题,可以从几方面解决问题? 2.HBase个别请求为什么很慢?你认为是什么原因? 3.客户端读写请求为什么大量出错?该从哪方面来分析? 4.大量服务端e...
vieky
2014/12/10
0
0
继上一次查应用的CPU飙高问题(http://www.cnblogs.com/hzmark/p/JVM_CPU.html)过去10天了。上次只是定位到了是一个第三方包占用了大量的CPU使用,但没有细致的去查第三方包为什么占用了这么...
蘑菇街隐修
2014/06/16
0
0
之前写过一篇 《闹心的Broken pipe》,nginx导致的请求超时,但是今天又碰到个奇葩事儿,容我喝一口82年的白开水慢慢道来 源起 项目中用到视频上传,两种上传方式,一种直接表单提交,一种内...
小尘哥
2018/10/18
0
0
@李老师 你好,想跟你请教个问题: Ignite 1.9配置的通写ORACLE,配置了事务支持CacheAtomicityMode.TRANSACTIONAL,关闭了后写缓存, 在测试时单表put时,当数据库数据越来越多,Ignite ca...
liwenlin000
2017/05/26
124
1
没有更多内容
加载失败,请刷新页面
加载更多前言 前面 FLink 的文章中我们已经介绍了说 Flink 已经有很多自带的 Connector。 1、《从0到1学习Flink》—— Data Source 介绍 2、《从0到1学习Flink》—— Data Sink 介绍 其中包括了 Sour...
火力全開
12分钟前
0
0
冒泡排序 比较相邻的元素。如果第一个比第二个小,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最小的数。 针对所有的元素...
基围虾21
14分钟前
0
0
nginx源码编译参数细述 --prefix= 指向安装目录--sbin-path 指向(执行)程序文件(nginx)--conf-path= 指向配置文件(nginx.conf)--error-log-path= 指向错误日志目录--p...
问题终结者
24分钟前
0
0
createDrawerNavigator抽屉效果,侧边滑出: createDrawerNavigator API createDrawerNavigator(RouteConfigs, DrawerNavigatorConfig): RouteConfigs(必选):路由配置对象是从路由名称到路......
不负好时光
27分钟前
1
0
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/c_duoduo/article/details/52083494 Windows下VSCode便携式c/c++环境 ——————2018.03.27更新—————— Visu...
shzwork
38分钟前
0
0
没有更多内容
加载失败,请刷新页面
加载更多