抓取java堆栈失败的思考-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堆栈失败的思考-Safepoint等的学习的更多相关文章
- 自动抓取java堆栈
参数1 进程名字,参数2 最大线程数 例: pid为8888,达到1000个线程时自动抓取堆栈信息 ./autojstack.sh 8888 1000 & #!/bin/bashfileNam ...
- 【转】【fiddler】抓取https数据失败,全部显示“Tunnel to......443”
这个问题是昨天下午就一直存在的,知道今天上午才解决,很感谢“韬光养晦”. 问题描述: 按照网络上的教程,设置fiddler开启解密https的选项,同时fiddler的证书也是安装到系统中,但是抓取h ...
- 【fiddler】抓取https数据失败,全部显示“Tunnel to......443”
这个问题是昨天下午就一直存在的,知道今天上午才解决,很感谢“韬光养晦”. 问题描述: 按照网络上的教程,设置fiddler开启解密https的选项,同时fiddler的证书也是安装到系统中,但是抓取 ...
- 网页Email抓取 java
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; impo ...
- 腾讯微博模拟登陆+数据抓取(java实现)
不多说,贴出相关代码. 参数实体: package token.def; import java.io.Serializable; import java.util.Properties; publi ...
- 新浪微博模拟登陆+数据抓取(java实现)
模拟登陆部分实现: package token.exe; import java.math.BigInteger; import java.util.Random; import org.apache ...
- 腾讯微博数据抓取(java实现)
不多说,同样贴出相关代码 参数实体: package token.def; import java.io.Serializable; import java.util.Properties; publ ...
- 新浪微博数据抓取(java实现)
多了不说,直接贴出相关部分的实现代码 加密部分实现: package token.exe; import java.math.BigInteger; import java.util.Random; ...
- 通过Fiddler抓取Java HttpClient的HTTP包
设置HttpClient访问Fiddler的代理即可. public static void main(String[] args) throws Exception { HttpPost httpP ...
- 巧用Grafana和Arthas自动抓取K8S中异常Java进程的线程堆栈
前言 近期发现业务高峰期时刻会出现CPU繁忙导致的timeout异常,通过监控来看是因为Node上面的一些Pod突发抢占了大量CPU导致的. 问: 没有限制CPU吗?是不是限制的CPU使用值就可以解决 ...
随机推荐
- AES算法在网络安全中的应用:如何守护数据宝藏?
摘要:高级加密标准(AES)是美国国家标准与技术研究所(NIST)用于加密电子数据的规范.本文从历史.算法原理.性能优势和应用等方面全面介绍了AES算法,旨在帮助读者更好地理解这一广泛应用的对称加密算 ...
- Python——第四章:迭代器(Iterators)
迭代器iterator: 提到迭代器,最典型的就是for循环 for 变量 in 可迭代: pass 可迭代对象iterable: 是指可以使用 for 循环进行遍历的对象.除了字符串 (str).列 ...
- Mybatis 源码2——SqlSession,执行器和一级缓存
一丶 SqlSessionFactoryBuilder,SqlSessionFactory,sqlSession mybatis 获取sqlSession是通过SqlSessionFactory获取的 ...
- flutter弹窗
AlertDialog: 优点:Material风格的弹窗,具有灵活的布局和样式自定义能力.易于使用,并提供了标题.内容和操作按钮的选项. 缺点:对于复杂的自定义布局和样式可能不够灵活. Bottom ...
- 神经网络基础篇:详解导数(Derivatives)
导数 一个函数\(f(a)=3a\),它是一条直线.下面来简单理解下导数.让 看看函数中几个点,假定\(a=2\),那么\(f(a)\)是\(a\)的3倍等于6,也就是说如果\(a=2\),那么函数\ ...
- 云图说 | 华为云MCP多云容器平台,让您轻松灾备!
摘要:多云容器平台是华为云基于多年容器云领域实践经验和社区先进的集群联邦技术,提供的容器多云和混合云的解决方案. 多云容器平台(Multi-Cloud Container Platform,MCP)是 ...
- Linux神器strace的使用方法及实践
在Linux系统中,strace命令是一个集诊断.调试.统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用,接下来就Linux系统调用工具strace的使用方法和实践给大家做个详细介绍,一起 ...
- 印尼Widya Robotics携手华为云,让建筑工地安全看得见
摘要:AI落地效率提升30倍,实时智慧安全检测,全天候保障劳工人身安全. 本文分享自华为云社区<云上360行 丨 印尼Widya Robotics携手华为云,让建筑工地安全看得见>,作者: ...
- 云图说 | 华为云医疗智能体EIHealth,AI赋能基因组研究
摘要: 华为云医疗智能体面为基因组研究,提供高性能.高可靠性.高性价比的基因测序计算.存储和AI能力. 本文分享自华为云社区<[云图说]第230期 医疗智能体:AI赋 ...
- 分析内部运行机制,教你解决Redis性能问题
摘要:聚焦Redis的性能分析,思考Redis 可以通过哪些机制来提高性能,当性能瓶颈发生的时候,我们又能做出哪些优化策略,最终确保业务系统的稳定运行. 本文分享自华为云社区<分析内部运行机制, ...