线程转储与堆转储的差异及Spring Boot线程转储JSON分析工具咨询
线程转储与堆转储的主要区别
- 记录内容不同:线程转储记录JVM内所有线程的当前状态,包括线程ID、名称、运行状态、调用栈轨迹、持有的锁信息等;堆转储记录JVM堆内存的完整快照,包含所有对象实例、属性值、对象间的引用关系等内存数据。
- 核心用途不同:线程转储主要用于排查线程阻塞、死锁、CPU占用过高、应用响应缓慢等线程相关问题;堆转储主要用于排查内存泄漏、OOM(内存溢出)、大对象占用内存过多等内存相关问题。
- 生成开销不同:线程转储生成速度快,对应用运行性能影响极小;堆转储需要遍历整个堆内存,生成耗时较长,会占用大量磁盘空间,对运行中的应用有短暂的性能影响。
Spring Boot Actuator的threaddump API
Spring Boot应用中,若已引入spring-boot-starter-actuator依赖,并通过配置暴露threaddump端点(例如配置management.endpoints.web.exposure.include=threaddump),访问http://localhost:8080/actuator/threaddump会返回JSON格式的线程转储数据。
该JSON响应包含每个线程的详细信息:线程ID、名称、线程状态(如RUNNABLE、BLOCKED)、调用栈轨迹、锁持有情况、线程所属线程池信息等。
分析JSON格式线程转储的工具
- Spring Boot Admin:可与Spring Boot应用集成,提供可视化界面直接查看和分析线程转储数据,能直观展示线程状态分布、锁竞争情况。
- IDE工具(如IntelliJ IDEA、Eclipse):将JSON内容复制到IDE中,利用其内置的JSON解析和代码分析功能,可快速查看线程调用栈,定位阻塞点。
- 命令行工具jq:通过编写jq表达式,可快速过滤、提取JSON中的关键线程信息,比如筛选出所有BLOCKED状态的线程,或提取特定线程的调用栈。
- 自定义解析代码:使用Jackson、Gson等JSON解析库编写简单程序,按需提取线程转储中的数据,适合定制化的分析需求。
内容的提问来源于stack exchange,提问作者Kiran Kranthi
相关产品推荐
相关产品推荐

