热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java每隔一小时fullgc_JVM菜鸟进阶高手之路六(JVM每隔一小时执行一次FullGC)

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

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

查看GC统计汇总情况:

jstat -gcutil pid 3s30

9939934b47da29d84674d4663330987c.png

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

05640f2e790b5805da4c613ef8697dfd.png

2837f0ac5e8bfa2b6c38de3646ea0acf.png

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复制

7552e8b5702637c25bc74f87433d315e.png

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

ff5ede0f7d637f49b7be0eead1d902f5.png

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

4d3f27d266c7afdb7bb7d6ddf09e41b8.png

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

cda505739a009885f9b7474dbb2dfee4.png

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

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

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

&#64;OnMethod(clazz &#61;"java.lang.System",method &#61;"gc")

public static void onSystemGC(){

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

jstack(); }复制

441ed47919ab9c3cb0c29d09489ab912.png

在本地调用模拟结果如下&#xff1a;

590f3a94be81d6d52bef25227eef7fe7.png

放到环境进行观察&#xff0c;也获取到了结果如下&#xff1a;

f424b82e324b93305f5f897ea21acc58.png

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

3fa8614725794a3d94f1580327286f88.png

20d3377e1b9ea5022a0ee1c818ac2008.png

0b3955935c4aa944a9c15d38d7525dff.png

5d2376f8bb79651be1616df63b10c496.png

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

93ddbb111c9774ca13653210afb1d009.png

后来又看见

44ff1b57f2e74dad3aa41c6187ee0ccc.png

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

d284eb4f1af4e88eb5999d167aba1760.png

查看该jar

2d83612f3f81e81fa1bc25f40ec12316.png

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

5829e89de15f1f72b102f15f3900fb45.png

新版本里面变成了10个小时一次了&#xff0c;而且可以通过jvm参数让其进行关闭&#xff0c;-Dorg.apache.cxf.JDKBugHacks.gcRequestLatency&#61;true即可。这次的这个一小时问题排除就结束了&#xff0c;还需要修改代码&#xff0c;后续继续观察&#xff0c;在此过程中&#xff0c;ak大神和阿飞都告诉我关于ygc时间问题&#xff0c;的确这个还一直在实验&#xff0c;希望优化的更好&#xff0c;内容很多一直也在学习&#xff0c;定位问题就是需要大胆的猜之后试之后优化修改记录。



推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
author-avatar
東臨天下2502892423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有