首页 > 其他分享 >记一次 JVM 崩溃问题排查(G1 日志分析)

记一次 JVM 崩溃问题排查(G1 日志分析)

时间:2024-08-12 21:27:21浏览次数:16  
标签:Java G1 cfree bug XX JVM 日志 崩溃

背景

上周五业务高峰期,有一个 java 实例毫无征兆的 crash 了,第一时间应用重启之后,将对应的崩溃日志保留,后面做分析。

先说一下该服务的具体情况:
jdk 版本:1.8.0_152-b16
服务器信息:16C32G
启动参数:-Xms18g -Xmx18g -Xss256k -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:MaxDirectMemorySize=6g -XX:+DisableExplicitGC -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=1024k -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./oom_info.dump -Xloggc:./oom_gcinfo.log -XX:CompressedClassSpaceSize=128m -XX:NativeMemoryTracking=detail

通过启动参数可以看到,使用的是 G1 收集器,且开启了 GC 日志打印。

排查过程

问题分析

由于 jvm 退出时,生成了 hs_err_pidxxx.log 文件,所以直接从该文件分析入手。
打开文件后,主要关注几块信息:

  • 文件第一行
    这部分会简要的说明崩溃原因
  • Problematic frame
    崩溃发生的帧所在
  • Current thread
    崩溃发生时的线程
  • siginfo
    崩溃信号信息
  • Stack
    崩溃时的栈详细信息
  • Native frames
    崩溃时的本地栈帧

在我的场景里,具体的信息为:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007efc3752faec, pid=19182, tid=0x00007efbc9279700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_152-b16) (build 1.8.0_152-b16)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.152-b16 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libc.so.6+0x85aec]  cfree+0x1c
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

---------------  T H R E A D  ---------------

Current thread (0x00007efc30077000):  ConcurrentGCThread [stack: 0x00007efbc917a000,0x00007efbc927a000] [id=19213]

siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x00007efc37ed0ff8

... 省略很多其他信息 ...

Stack: [0x00007efbc917a000,0x00007efbc927a000],  sp=0x00007efbc92788f8,  free space=1018k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libc.so.6+0x85aec]  cfree+0x1c

在这份报告当中,第一行直接说明了崩溃原因:
SIGSEGV (0xb) at pc=0x00007efc3752faec, pid=19182, tid=0x00007efbc9279700

SIGSEGV (0xb) 表示段错误,通常是由于尝试访问未分配或未映射的内存地址引起的。

而对应的Problematic frame: C [libc.so.6+0x85aec] cfree+0x1c也说明了这个崩溃是在执行 cfree 时发生的。
到这一步应该有了大概的概念了:jvm 运行时释放了一段未分配或者未映射的内存地址引起的。

但是怎么引起的呢?这个时候就需要通过崩溃发生时的线程Current thread来确认了,对应的值是:

ConcurrentGCThread

所以到这里,基本上就可以确认,是 G1 收集器的 bug。

问题原因

在官网看了 jdk8 的 release note 之后,找到一个 bug修复记录 JDK-8191393 : Random crashes during cfree+0x1c,里面记载了这个 bug 的修复时间和版本,bug 修复讨论 记录了 bug 产生的原因。
大概原因就是同时启用了 -XX:+UseG1GC 和 -XX:+UseGCLogFileRotation 在打印 gc 日志时的并发问题,有兴趣的同学可以详细看看源码。

标签:Java,G1,cfree,bug,XX,JVM,日志,崩溃
From: https://www.cnblogs.com/gonzo/p/18355792

相关文章

  • Windows日志致盲与绕过
    前言在渗透测试过程中,Windows日志往往会记录系统上的敏感操作,如添加用户、写计划任务、远程登录执行等操作,对于会审计的安全运维人员或者网络管理员来说,简直就是脱掉衣服走路,被看的一清二楚。对于比较高阶的渗透操作中,要讲究的是动作无感化,来无影去无踪。而对于防御者来说,了解常......
  • 解决阿里云CLB的健康检查后业务日志中出现“Connection reset by peer”的错误
    目录起因排查过程问题原因解决方案方案一:更换监听类型(TCP→HTTP/HTTPS)方案二:日志过滤方案三:关闭日志级别info推荐方案起因环境:阿里专有云平台今天发现nginx日志中频繁出现类似Connectionresetbypeer的网络连接错误排查过程起初怀疑是Nginx配置问题,但检查后确认配置正......
  • JVM参数详解:优化应用程序性能的关键
    Java虚拟机(JVM)是Java程序的运行环境,它负责将Java字节码转换为机器码,并在实际计算机上执行。为了优化应用程序的性能,我们需要了解JVM的参数设置。本文将详细介绍JVM的常见参数及其作用,帮助您更好地理解和配置JVM。JVM参数分类JVM参数分为两大类:启动参数和系统属性。1.启......
  • Loguru:Python 日志终极解决方案
    日志的重要性日志的作用非常重要,日志可以记录用户的操作、程序的异常,还可以为数据分析提供依据,日志的存在意义就是为了能够在程序在运行过程中记录错误,方便维护和调试,能够快速定位出错的地方,减少维护成本。每个程序员都应该知道,不是为了记录日志而记录日志,日志也不是随意记的。要......
  • node项目log4js进行日志记录
    node项目log4js进行日志记录超人鸭关注IP属地:广东0.1072022.09.0818:25:04字数1,973阅读827安装与了解npminstalllog4js--save目前的版本是:6.6.1在终端打印消息:importlog4jsfrom'log4js'constlogger=log4js.getLogger()logger.level='all'lo......
  • JVM内存结构的划分
    5.3JVM内存结构的划分5.3.1栈(保存局部变量和方法调用的信息)栈也是线程私有的,在我们调用方法的时候,每调用一个方法,该方法就会进入栈中,当该方法执行完毕的时候就会从栈中移除。比如说现在要在main方法中调用A方法,在A方法中再调用B方法:但是,如果我们不停的调用方法,就会导致栈满......
  • Java学习笔记1--JDK,JRE和JVM
    1、Java开发环境Java开发环境是指Java程序员开发、编写、测试和调试Java程序所使用的所有工具和技术。Java开发环境通常由以下几个部分组成:JDK(JavaDevelopmentKit):JDK是Java开发环境的核心组件,它包括了Java编译器、JRE(Java运行环境)、JavaDoc文档生成器和其他一些工具。JDK是J......
  • PostgreSQL的WAL日志详解
    PostgreSQL的WAL日志详解1.WAL日志介绍1.1WAL介绍wal日志即writeaheadlog预写式日志,简称wal日志。wal日志可以说是PostgreSQL中十分重要的部分,相当于oracle中的redo日志。当数据库中数据发生变更时:change发生时:先要将变更后内容计入walbuffer中,再将变更后的数据写入data......
  • 499 道 Java 面试题 (附答案):JVM+ 分布式 + 算法 + 锁 +MQ
    Spring如何管理事务的。Spring怎么配置事务(具体说出一些关键的xml元素)。说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。Springmvc中DispatcherServlet初始化过程。netty......
  • python 提取日志错误请求批量重新请求
    因为有服务器线上偶发异常,所以需要获取Nginx访问日志重新请求补全数据,这时会借助python获取错误请求的URL,然后重新请求。具体如下:importtimeimportrequestsfromurllib.parseimporturljoin#定义一个集合用于存储已处理的URL,避免重复处理processed_urls=set()with......