【JavaError】使用Java的G1GC的时候,偶尔会发生的bug

客户发生的一个问题,正常使用的Tomcat服务,会再突然之前发生Tomcat停止的问题。
发生问题的时候,Tomcat的catalina.out里面,有下面的类似Error Log。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f85942f6e76, pid=1887, tid=0x00007f8592efa700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x5cae76]  G1ParScanThreadState::copy_to_survivor_space(InCSetState, oopDesc*, markOopDesc*)+0x196
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /tmp/hs_err_pid1887.log
[thread 140211673609984 also had an error]
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

我先是调查了一下我们写的代码和log文件,没发现任何问题。
Google了一下,感觉上时Java本身的Bug的可能性很高。

下面时检索到的,一些类似问题,其实很多人登录过,不过都没有解决。(2018/10时点)

回答内容简单总结一下,

This kind of issues can be caused by any bug that corrupts heap memory. 
It could be an issue with GC, with the compiler, with bad native code, 
If you have strong reproducer kindly share with us. We will reproduce at our end and try to fix the issue.

继续Google,发现下面的一个博客,貌似跟G1GC有关系。

我们可客户的JVM设定,的确时用了G1GC。

-Xmx6144M -Xms6144M -Xss1024k -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Xloggc:/opt/jakarta-tomcat/logs/gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+DisableExplicitGC -XX:+DoEscapeAnalysis -XX:MaxGCPauseMillis=50 -XX:-OptimizeStringConcat -XX:+PrintClassHistogramAfterFullGC -XX:+PrintClassHistogramBeforeFullGC -XX:+UseCompressedOops -XX:+UseG1GC

总结来说,出现类似的问题,应该时Java本身Bug的可能性非常高。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
G1GC是一种垃圾回收器,它是Java虚拟机中的一部分,用于管理内存中的垃圾对象。G1GC的全称是Garbage-First,它采用了一种独特的垃圾回收策略,可以在多线程同时工作的情况下进行垃圾回收,并且可以与应用程序交替执行,不完全阻塞应用程序。 G1GC的主要特点包括: - 分代回收:G1GC将堆内存划分为多个区域,每个区域称为一个分代。它根据垃圾对象的分布情况,优先回收垃圾最多的分代。 - 并发回收:G1GC可以在应用程序运行的同时进行垃圾回收,减少了停顿时间。 - 区域化回收:G1GC将堆内存划分为多个区域,每个区域都可以独立进行垃圾回收,提高了回收效率。 - 可预测的停顿时间:G1GC通过控制每次垃圾回收的时间,可以实现可预测的停顿时间,避免了长时间的停顿对应用程序性能的影响。 要在Tomcat中启用G1GC,可以按照以下步骤进行配置: 1. 打开Tomcat的启动脚本文件(如catalina.sh或catalina.bat)。 2. 在JAVA_OPTS环境变量中添加以下参数: ``` -XX:+UseG1GC -XX:MaxGCPauseMillis=<最大停顿时间> -XX:G1HeapRegionSize=<堆区域大小> ``` 其中,`<最大停顿时间>`是期望的最大停顿时间(以毫秒为单位),`<堆区域大小>`是每个堆区域的大小(以字节为单位)。 3. 保存并关闭启动脚本文件。 4. 重新启动Tomcat。 请注意,G1GC的配置参数可以根据具体的应用程序需求进行调整。建议根据实际情况进行性能测试和调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值