首页 > 编程语言 >抓取java堆栈失败的思考-Safepoint等的学习

抓取java堆栈失败的思考-Safepoint等的学习

时间:2023-12-23 12:00:15浏览次数:37  
标签:java 抓取 线程 jvm 堆栈 Safepoint

抓取java堆栈失败的思考-Safepoint等的学习


背景

前期解决问题都是靠抓取进程堆栈
jstack,后者是jmap到内存dump的方式来进行分析.

最近连续有两个比较大的项目出现了抓取dump/stack 失败的情况. 
具体原因可能还不太一样. 周末再翻找之前的资料时猜到了可能得几个原因.
想总结一下. 

因为自己并没有看过JVM的源码, 所以可能会是错误的. 
希望能够再后续的工作中去求证或者是证伪

后面也想描述一下一个简单的解决思路. 其实之前也总结过.

jvm的堆栈信息的获取.

jstack -l $pid  查看运行的堆栈信息.
jmap -heap $pid 查看堆的简要信息.
jmap -histo $pid 查看堆中对象的占用情况.
jmap -dump:format=b,file=/root/somefile $pid  
获取dump文件, 注意需要使用 IBM的mat等工具进行分析. 
这些操作得到的结果逐渐复杂, 并且消耗的时间和资源也越来越多. 

关于抓取的过程

JVM在运行期间, 其实是有很多线程的
如果无法内部查看, 可以使用 top -Hp $pid 的方式是简单查看一下大体的线程信息. 

这里的线程数,其实会包含 java的守护线程, GC线程, 线程池线程,以及编译器等线程. 

使用java工具进行抓取时, 理论上是要求 jvm里面的线程都到达 safepoint才可以的. 
但是某些情况下可能无法到达safepoint ,可能就会出现严重的问题. 导致抓取失败. 

如果可以到达, 那么就可以直接进进行堆栈的快照以及信息展示. 
所以需要注意,不要随便进行 jstack 等堆栈信息的获取,会触发一次 STW, 如果safepoint的到达比较慢
会出现严重的卡顿现象. 

关于safepoint

Java虚拟机HotSpot的实现中,使用一组称为OopMap的数据结构来存放对象引用,从而可以快速且准确的完成GC Root扫描。
但程序执行的过程中,引用关系随时都可能发生变化,而HotSpot虚拟机只会在特殊的指令位置才会生成OopMap来记录引用关系,
这些位置便被称为Safepoint。
换句话说,就是在Safepoint这个点上,虚拟机对于调用栈、寄存器等一些重要的数据区域里什么地方包含了什么引用是十分清楚的,
这个时候是可以很快完成GC Roots的扫描和可达性分析的。
HotSpot会在所有方法的临返回之前,以及所有Uncounted loop的循环回跳之前放置Safepoint。
当需要GC时候,虚拟机会首先设置一个标志,然后等待所有线程进入Safepoint,
但是不同线程进入Safepoint的时间点不一样,先进入Safepoint的线程需要等待其他线程全部进入Safepoint,所以Safepoint是会导致STW的。

来源小米科技: 
https://mp.weixin.qq.com/s/GEwD1B-XqFIudWP_EbGgdQ

抓取堆栈失败的两种情况

1. 第一个是K8S项目, 因为podpidslimit的问题, jvm无法再生成一个新的线程, 导致抓取失败. 
   这个问题比较好解释, 因为系统的线程资源耗尽, 导致无法工作. 
   解决问题的思路也比较简单. 修改podpidslimit 或者是修改线程数的数量, 避免大量占用就可以了 

2. 第二个就是昨天遇到的, 怀疑跟小米科技的问题一样. 
   怀疑产品有一个 : Counted loop
   解释为: JVM认为比较短的循环,所以不会放置Safepoint,比如用int作为index的循环。
   怀疑产品里面有一个 int类型的比较大的循环, 一直在占用CPU. jvm又无法再可数循环结束之前插入safepoint
   导致除了GC线程和这个工作线程之外,大家都在等他俩到达Safepoint. 
   同事处于STW的状态, 导致异常无法提供服务 并且也因为无法到达saftpoint
   导致抓取线程堆栈信息失败. 

关于解决思路

使用gdb 在操作系统层抓取core文件
然后使用jvm 解析core dump文件为 java可读文件
在使用 mat进行分析
在不可能时提供一种可能得解决思路. 

标签:java,抓取,线程,jvm,堆栈,Safepoint
From: https://www.cnblogs.com/jinanxiaolaohu/p/17922844.html

相关文章

  • 【转载】JAVA 百度坐标,火星坐标和WGS84之间互转
    原出处:https://www.cnblogs.com/Fooo/p/16986453.html/***a*/publicfinalstaticdoublea=6378245.0;/***ee*/publicfinalstaticdoubleee=0.00669342162296594323;//圆周率GCJ_02_To_WGS_84publicfinalstatic......
  • 【poi】使用poi时报错:java.io.EOFException: Unexpected end of ZLIB input stream
    错误写法Workbookworkbook=null;try{//会报错Filefile=newFile("D:\\1.xlsx");workbook=newXSSFWorkbook(file);ByteArrayOutputStreambaos=newByteArrayOutputStream(); workbook.write(baos); workbook.close(); bytes=baos......
  • Java Spring Boot 配置读取进阶篇-@ConfigurationProperties && @Value
    之前我们学习了在SpringBoot如何读取application.properties/application.yaml配置文件的配置信息,在上文中我们主要是简单地实践了些简单的设置,这次我们带着同样的问题,如果配置更加复杂,我们的配置读取又应该怎么处理呢。本文的学习主要基于SpringBoot自带的库来解析配置,......
  • javascript中的点击事件
     <!DOCTYPEhtml><html>    <head>        <metacharset="utf-8">        <title></title>    </head>    <body>        <tableborder>            <tr>                <th><i......
  • JavaScript数组
    数组在JavaScript开发中,数组主要用于临时存储多个数据,可以存放不同类型的数据。数组的定义数组的定义有两种方式:①使用Array对象使用new关键字实现,语法如下://定义一个空数组letarray=newArray();//定义元素值位数值的数组letarray=newArray(1,2,3,1.3);//......
  • JAVA云his系统、门诊、住院业务使用流程知识总结
    云HIS系统是一款满足基层医院机构各类业务需要的健康云系统。系统能帮助基层医院机构完成日常各类业务,提供病患挂号支持、病患问诊、电子病历、开药/发药、会员管理、统计查询、医生站和护士站等一系列常规功能,还能与公卫、PACS等各类外部系统融合,实现多层机构(医院)之间的融合管理。......
  • java云HIS源码:云端部署,支持多医院、多门诊、多机构、实现医疗数据共享与交换
    系统概述云HIS是针对中小医疗机构推出的一套基于云端的云HIS服务平台,借助云his,将医院业务流程化,大大提高医院的服务效率和服务质量,为客户提供医院一体化的信息解决方案。云his系统是用计算机网络将医院内各个环节(门诊计价收费、门诊药房、住院信息、临床科室、医技、财务等)全部连......
  • Java零基础 - java堆
    哈喽,各位小伙伴们,你们好呀,我是喵手。  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学......
  • Java面试小练(十一)
    1).TypeScript相对于JavaScript的主要优势包括:a.类型检查:TypeScript通过静态类型检查,可以在编译时发现潜在的问题,从而减少运行时的错误。b.更好的代码可读性和可维护性:TypeScript通过提供类型定义,使得代码更加清晰易读,降低了维护难度。c.支持ES6和更高版本的特性:TypeScript......
  • Java第十六课_IO流
    1.Collections常用工具Collections常用工具publicstaticvoidmain(String[]args){List<String>list=newArrayList<>();list.add("ddd");list.add("aaa");list.add("bbb");l......