抓取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使用值就可以解决 ...
随机推荐
- 【OpenCV】 OpenCV 源码编译并实现 CUDA 加速 (Windows)
目录 1. 环境准备 1.1 软件环境 1. 2 源码下载 2. CMake编译项目 2.1 创建cmake项目 2.2 设置编译配置 2.3 解决异常 2.3.1 文件下载异常 2.3.2 解决CU ...
- 零基础电气专业毕业生,花费9.9元自学前端,成都月薪6.5K
介绍 毕业于成都理工电气专业,大学毕业后进入了一家电气公司,月薪2000元.一直对互联网行业感兴趣,但由于没有相关专业背景,所以一直没有勇气转行. 转行契机 公司的书记想搞一个内部生产管理系统,看我们 ...
- JavaFx之播放MP4(二十七)
JavaFx之播放MP4(二十七) JavaFX 视频和音频支持,由 JavaFX 媒体类 Media.MediaPlayer.MediaView 和 AudioClip 提供. import jav ...
- 快速掌握服务网格系列二:云原生、K8S、服务网格(Service Mesh)及微服务之间的关系
快速掌握服务网格系列二:云原生.K8S.服务网格(Service Mesh)及微服务之间的关系 首先看下CNCF对云原生的定义: Cloud native technologies empower o ...
- 关于向上转型以及向下转型、instanceof的一些应用。
一.前言 在Java编程中,我们常常遇到各种类型转换的情况,尤其是在处理继承关系的类时.本文将深入探讨Java中的向上转型(upcasting).向下转型(downcasting)以及instance ...
- JavaImprove--Lesson02--Object类,Objects工具类,封装类
一.Object类 Java中的Object类是所有类的超类,它是Java类层次结构的根类.这意味着所有的类都直接或间接地继承自Object类 equals(Object obj): 用于比较两个对象 ...
- 如何更好的分析潜在人脉?聊聊华为云图引擎GES的Cypher子查询
摘要:本文以华为云图引擎 GES 为例,来介绍如何使用图查询语言 Cypher 表达一些需要做数据局部遍历的场景. 本文分享自华为云社区<使用 Cypher 子查询进行图探索 -- 以华为云图引 ...
- 云图说丨云数据库GaussDB(for MySQL)事务拆分大揭秘
摘要:数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载. 本文分享自华为云社区<[云图说]第270期 云数据库GaussDB(for MySQL)事务拆 ...
- 一文带你认识AscendCL
摘要:AscendCL(Ascend Computing Language,昇腾计算语言)是昇腾计算开放编程框架,是对底层昇腾计算服务接口的封装. 本文分享自华为云社区<[CANN文档速递09期 ...
- GIS拓扑讲解点线面几何体的拓扑关系判断及运算分析_turf案例
Turf.js简介 Turf.js是JavaScript 空间分析库,由Mapbox 提供,Turf 实现了 空间分析操作,例如生成缓冲区.计算等高线,建立 TIN 等: 空间几何对象关系的计算,点 ...