抓取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等的学习的更多相关文章

  1. 自动抓取java堆栈

    参数1 进程名字,参数2 最大线程数 例: pid为8888,达到1000个线程时自动抓取堆栈信息 ./autojstack.sh 8888 1000 & #!/bin/bashfileNam ...

  2. 【转】【fiddler】抓取https数据失败,全部显示“Tunnel to......443”

    这个问题是昨天下午就一直存在的,知道今天上午才解决,很感谢“韬光养晦”. 问题描述: 按照网络上的教程,设置fiddler开启解密https的选项,同时fiddler的证书也是安装到系统中,但是抓取h ...

  3. 【fiddler】抓取https数据失败,全部显示“Tunnel to......443”

    这个问题是昨天下午就一直存在的,知道今天上午才解决,很感谢“韬光养晦”. 问题描述:  按照网络上的教程,设置fiddler开启解密https的选项,同时fiddler的证书也是安装到系统中,但是抓取 ...

  4. 网页Email抓取 java

    import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; impo ...

  5. 腾讯微博模拟登陆+数据抓取(java实现)

    不多说,贴出相关代码. 参数实体: package token.def; import java.io.Serializable; import java.util.Properties; publi ...

  6. 新浪微博模拟登陆+数据抓取(java实现)

    模拟登陆部分实现: package token.exe; import java.math.BigInteger; import java.util.Random; import org.apache ...

  7. 腾讯微博数据抓取(java实现)

    不多说,同样贴出相关代码 参数实体: package token.def; import java.io.Serializable; import java.util.Properties; publ ...

  8. 新浪微博数据抓取(java实现)

    多了不说,直接贴出相关部分的实现代码 加密部分实现: package token.exe; import java.math.BigInteger; import java.util.Random; ...

  9. 通过Fiddler抓取Java HttpClient的HTTP包

    设置HttpClient访问Fiddler的代理即可. public static void main(String[] args) throws Exception { HttpPost httpP ...

  10. 巧用Grafana和Arthas自动抓取K8S中异常Java进程的线程堆栈

    前言 近期发现业务高峰期时刻会出现CPU繁忙导致的timeout异常,通过监控来看是因为Node上面的一些Pod突发抢占了大量CPU导致的. 问: 没有限制CPU吗?是不是限制的CPU使用值就可以解决 ...

随机推荐

  1. IIS通过ARR实现负载均衡

    一.实现整体方式介绍 项目中部署在windows服务器上的项目,需要部署负载均衡,本来想用nginx来配置的,奈何iis上有几个项目,把80端口和443端口占用了,nginx就用不了了(因为通过域名访 ...

  2. 春秋云镜 - CVE-2022-32991

    靶标介绍: 该CMS的welcome.php中存在SQL注入攻击. 访问页面,先注册,使用邮箱加密码登录. bp抓包,后台挂上sqlipy然后去测welcome.php,常用的语句都没成功但过一会就有 ...

  3. 聊聊ChatGLM-6B的源码分析

    基于ChatGLM-6B第一版,要注意还有ChatGLM2-6B以及ChatGLM3-6B 转载请备注出处:https://www.cnblogs.com/zhiyong-ITNote/ Prefix ...

  4. Weblogic获取端口IP

    Weblogic获取端口IP 获取端口IP只为了判断哪个节点 调用 private WebMBeanServer server=new WebMBeanServer(); synlog.info(&q ...

  5. 用 Socket.D 替代原生 WebSocket 做前端开发

    socket.d.js 是基于 websocket 包装的 socket.d 协议的实现.就是用 ws 传输数据,但功能更强大. 功能 原生 websocket socket.d 说明 listen ...

  6. 28、Flutter Key详解

    在Flutter中,Key是不能重复使用的,所以Key一般用来做唯一标识.组件在更新的时候,其状态的保 存主要是通过判断组件的类型或者key值是否一致.因此,当各组件的类型不同的时候,类型已经足够 用 ...

  7. Langchain-Chatchat项目:3-Langchain计算器工具Agent思路和实现

      本文主要讨论Langchain-Chatchat项目中自定义Agent问答的思路和实现.以"计算器工具"为例,简单理解就是通过LLM识别应该使用的工具类型,然后交给相应的工具( ...

  8. C++篇:第十二章_文件及IO_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十二.文件及IO 当在输入输出流中使用控制符进行格式控制时,需在程序中加入头文件 ...

  9. 详解Apache Sentry->Ranger平滑升级方案

    摘要:本文主要探讨如何平滑解决sentry到ranger升级过程中的权限迁移问题. 本文分享自华为云社区<[平滑上云]Apache Sentry->Ranger平滑升级方案>,作者: ...

  10. MyBatis中SQL语句优化小结

    摘要:MyBatis 作为一款优秀的持久层框架,它支持自定义SQL.存储过程以及高级映射. MyBatis 作为一款优秀的持久层框架,它支持自定义SQL.存储过程以及高级映射.它免除了几乎所有的 JD ...