上次分析详细地址在:JVM 菜鸟进阶高手之路五

以为上次问题是 rmi 的问题就此结束了,但是问题并没有结束,其实本次问题不是 rmi 问题导致的,但是 rmi 也的确可能会有 sys.gc fullgc 问题。

查看 GC 统计汇总情况:

jstat -gcutil pid 3s 30

参考 gc,发现大概一小时运行一次 FGC,特别奇怪,笨神一看这样的问题就知道是 system gc 导致的

System.gc()的默认效果是引发一次 stop-the-world 的 full GC,对整个 GC 堆做收集。用 -XX:+DisableExplicitGC参数后,System.gc()的调用就会变成一个空调用,完全不会触发任何 GC。

问题来了 如果直接使用-XX:+DisableExplicitGC 就没有下面的任何事情了,在测试过程中的确使用了该参数,的确不会有 full gc 了。但是有写堆外空间的释放是需要涉及到 System.gc 的,如果禁用可能见到 direct memory 的 OOM 类似的异常,由于各种原因我们的环境没有禁用。由于没有禁用,添加参数**-XX:+ExplicitGCInvokesConcurrent** 该方法可以指定 System.gc()采用 CMS 算法,FGC 时停机时间会变短,但是 CMS GC 次数不会变。通过该参数 经过观察日志效果比 Full GC 要好些。

看到这里一切都挺完美,后面开始要到高潮了,纠结…………看上篇文章里面有说一直以为是 rmi 问题,就查找资料想让时间延迟下执行,

-Dsun.rmi.dgc.client.gcInterval=36000000

-Dsun.rmi.dgc.server.gcInterval=36000000

单位是毫秒,可适当延长触发 FGC 的定时时间间隔。 文中配置为 10 小时。通过 jstack 查看 JVM 线程

GC Daemon" daemon prio=10 tid=0x00007f91bcccf800 nid=0x37f0 in Object.wait() [0x00007f9182706000]

java.lang.Thread.State: TIMED_WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

- waiting on <0x0000000600021a48> (a sun.misc.GC$LatencyLock)

at sun.misc.GC$Daemon.run(GC.java:117)

- locked <0x0000000600021a48> (a sun.misc.GC$LatencyLock)

Locked ownable synchronizers:

- None

笨神告诉我们,如果该线程一旦创建了就会间隔的调用 gc 了,所以就会存在定时继续 full gc 问题。一直通过观察居然没有效果,还是会一小时执行一个 full gc。通过 gc 日志可以出出来:

而且 old 区 6g 才占 2.5G 就 background cms gc 了

修改为 cms 的时候,每次 System.gc 一次 full gc 的时候 cms gc 还会加 2 的,触发的是 background cms gc 如果不是后台就会一次,cms 过程如下:

里面有一些概念比较重要,并行和并发的定义。gc 这个场景下 你可以这么记 并发表示 gc 线程可以和业务线程同时跑 并行表示 gc 线程跑的时候业务线程都全不能跑 。

在 Java 9 中将 Java 8 默认的 GC 从 Parallel GC 改为 G1,cms 不是和 ps 比速度的,cms 是低延时垃圾回收器。

开始纠结了笨神告诉需要通过 btrace 跟踪下就很容易定位到问题那里调用了 System.gc,根据 ak 大神提供的地址,之后阿飞给了我关于 btrace 新的 github 地址: https://github.com/btraceio/btrace。 以及一些 Sample 参考: https://github.com/btraceio/btrace/tree/master/samples。github 官网很多参考样例,基本上能覆盖常用的需求编写了查看 gc 代码如下:

@OnMethod(clazz = "java.lang.System", method = "gc")

public static void onSystemGC() {

println("entered System.gc()");

jstack();

}

在本地调用模拟结果如下:

放到环境进行观察,也获取到了结果如下:

打印到这里 知道是 sun.misc.GC 调用的,在这里走了很多弯路了,后来我把 rmi 去掉了,但是还是一小时一次通过日志观察,后来搜索发现 tomcat 文章,

的确有,开始也没有注意,以为是这个原因,修改了重试还是不行,后是一波折过程,后来查看 jar 文件,的确不是一小时了,

后来又看见

以为这个包问题,又是一波修改,发现还是一小时执行一次通过日志观察,此时我已经无语了,不过还好在我的坚持下,还是把问题找到了,由于我把项目去掉跑不会有,那么感觉和项目有关,但是代码里面的确没有调用,我怀疑是否是其他 jar 里面的问题呢?我把所有的 jar 都查了一遍,的确发现问题了。

查看该 jar

由于包的确有点老了,里面的确是这样,和上面的 tomcat 那个 bug 很像,我下载了一个新版本查看,发现的确优化了。

新版本里面变成了 10 个小时一次了,而且可以通过 jvm 参数让其进行关闭,

-Dorg.apache.cxf.JDKBugHacks.gcRequestLatency=true即可。这次的这个一小时问题排除就结束了,还需要修改代码,后续继续观察,在此过程中,ak 大神和阿飞都告诉我关于 ygc 时间问题,的确这个还一直在实验,希望优化的更好,内容很多一直也在学习,定位问题就是需要大胆的猜之后试之后优化修改记录。后续会分享关于 ygc 时间长问题,推荐一款在线分析 gc 的好工具析,http://gceasy.io 。 非常棒,在此再次感谢笨神,阿飞哥,ak 大神的指导。

java 每隔一小时运行_每隔一小时执行一次 Full GC 分析排查相关推荐

  1. 模拟文件管理器的java可以编译但无法运行_在java学习经典问题he解答(6)

    1.Applet和普通的Java应用程序有什么区别? (1)运行方式不同.Java Applet程序不能单独运行,它必须依附于一个用HTML语言编写的网页并嵌入其中,通过与Java兼容的浏览器来控制执 ...

  2. java的class怎么直接运行_如何运行Java程序和设置CLASSPAT | 中国网管联盟

    如何运行JAVA和CLASSPATH环境变量的设置是学习和使用JAVA中最基本的问题,本不应在此赘述.但近来不少人在论坛上提出的问题却与此有关,我平时碰到的一些初学者也往往在这个问题上卡了壳,因此写了 ...

  3. java 64位win7不运行_我的世界点击启动没反应!我家是win764位,安装64位java,就是起动不了!...

    请问您下复的是大型整合包吗,制如果是请看下面:bai1.请检du查您安装目录中的zhi1.minecraft文件夹中的mods文件夹是否dao装了过多的mod.2.请检查您的电脑内存是多少,MC至少需 ...

  4. JAVA程序不同环境怎么运行_根据程序的构成和运行环境的不同,Java源程序分为两类,即________程序和________程序...

    从金 属学的观点来看,冷加工和热加工是以( )温度为界限区分的 (5.0分) 下列哪一个关系,智商的相似性会更高( ) 完成数制之间的转换: ( 110011001101 ) 2 =( ) 10 =( ...

  5. 微信24小时到账_微信转账24小时可撤销吗?延时到账功能可帮忙!

    微信转账中有一个延时到账功能,如果设置转账到账时间为24小时到账,及时对方确认收钱,钱也不会立马到对方账户中,钱会在24小时后到账.这段期间,如果发现转账对象错误或者是被骗,可以积极联系微信官方或者警 ...

  6. 记事本写的python怎么运行_如何在记事本++中执行Python文件?

    慕哥9229398 第一种选择:(最简单,推荐)打开记事本++.在菜单上转到:运行->运行.(F5).输入:C:\Python26\python.exe "$(FULL_CURRENT ...

  7. mysql 执行计划不对_关于mysql主从查询执行计划不一致问题的分析

    最近面试过程中被面试官抛了一个问题,说曾经有一个线上出现的奇怪的问题,主库和从库各种配置是一致的,当数据量比较大的时候,某些时候同样的查询,在从库里的执行计划执行成功了,而主库里没有执行这个执行计划, ...

  8. jmap 文件解析_干货分享丨jvm系列:dump文件深度分析

    摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因.那么dump文件的内容是什么样的呢? JVM ...

  9. java怎么在记事本里写过运行_[置顶] 如何运行用记事本写的java程序

    今天用记事本写了一个java程序,测试能运行,现在把它分解成几个步骤,利于大家理解: 1. 新建一个记事本,后缀名是  .java  :然后在里面写一段java的代码,如图: 2.把写好的java文件 ...

最新文章

  1. 认识人和鱼的AI,能识别美人鱼吗?阿里CVPR论文试用因果推理方法解答
  2. 正确的WordPress文件权限[关闭]
  3. Unity游戏开发技巧集锦2.1.3实现效果
  4. ElementUI中el-table添加小计行之后调整在滚动条上方
  5. bugzilla perl mysql apache windows,windows下apache安装bugzilla
  6. 关于计算机的发展过程及基础知识正确的是,2011doc-计算机基础知识.doc
  7. svn 分支合并(Subclipse例子)
  8. 使用Nginx搭建图片服务器(windows7)
  9. makefile中=、:=和+=的区别
  10. cf Educational Codeforces Round 77 D. A Game with Traps
  11. 微软官方 Windows 10 更新安装失败的解决办法
  12. 51单片机300个proteus仿真实例下载
  13. delphi自带控件操作excel
  14. MySQL高可用之PXC详解
  15. 2021年编程语言排行榜出炉,第一名实至名归!
  16. Excel怎么合并单元格
  17. 内容市场的2017年:五件大事,每件事都惊心动魄
  18. CocoaTouch框架与构建应用界面
  19. SQLSERVER2005发送邮件
  20. java 复制excel_Java 复制Excel工作表

热门文章

  1. 2021 前端面试经常被问到 Javascript+HTML5+CSS+ 框架问题(89 篇资料总结)
  2. 官宣!DolphinScheduler 毕业成为 Apache 软件基金会顶级项目
  3. 从苹果 M1 看芯片技术发展趋势
  4. 弃用 Cookie!
  5. 国际研究机构:阿里巴巴语音AI中国第一
  6. 惊艳!Uber 的豪华开源深度学习“全家桶”
  7. TIOBE 12 月编程语言排行榜:争夺年度编程语言,Java、C、Python、C# 即将开战!...
  8. 不想“被out”?来看看现在的开发者都在做什么
  9. 程序员,活得是本事:30 岁后的 20 条人生建议
  10. 这本在日本销量突破70W+的 Python 书,凭什么这么火?