打印Java程序的线程栈信息方式
作者:天已青色等烟雨来 发布时间:2021-11-02 19:00:28
标签:打印,Java,线程栈
打印Java程序的线程栈信息
jstack可以得知当前线程的运行情况
安装jstack等命令集,jstack是开发版本jdk的一部分,不是开发版的有可能找不到
yum install -y java-1.8.0-openjdk-devel
查看要打印堆栈的java进程ID
jps -l
打印堆栈
sudo -u admin jstack pid > jstack.txt
特别要注意的是jstack需要使用与进程一致的用户才能正确导出堆栈,否则会报错如下
Unable to open socket file: target process not responding or HotSpot VM not loaded
线程池异常堆栈的坑
import java.util.concurrent.*;
public class DivTask implements Runnable{
int a,b;
public DivTask(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
double re = a/b;
System.out.println(re);
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
// ThreadPoolExecutor executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS
// , new SynchronousQueue<>());
TraceThreadPoolExecutor executor = new TraceThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS
, new SynchronousQueue<>()); //扩展TraceThreadPoolExecutor
for (int i = 0; i < 5; i++) {
// executor.submit(new DivTask(100,i));
//改进方式一:
//Future re = executor.submit(new DivTask(100, i));
//re.get();
//改进方式二:
executor.execute(new DivTask(100,i));
}
//100.0
//25.0
//33.0
//50.0
//其中100/0的异常结果没打印
//线程池很有可能"吃掉程序抛出的异常
//改进方式一:
//Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
//at java.util.concurrent.FutureTask.report(FutureTask.java:122)
//at java.util.concurrent.FutureTask.get(FutureTask.java:192)
//。。。
//改进方式二:
//Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
//at com.Test.DivTask.run(DivTask.java:15)
//at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
//at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
//at java.lang.Thread.run(Thread.java:748)
//100.0
//33.0
//25.0
//50.0
//扩展TraceThreadPoolExecutor
//java.lang.Exception: Client stack trace
//at com.Test.TraceThreadPoolExecutor.clientTrace(TraceThreadPoolExecutor.java:20)
//at com.Test.TraceThreadPoolExecutor.execute(TraceThreadPoolExecutor.java:12)
//at com.Test.DivTask.main(DivTask.java:29)
//Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
//at com.Test.DivTask.run(DivTask.java:15)
//at com.Test.TraceThreadPoolExecutor.lambda$wrap$0(TraceThreadPoolExecutor.java:25)
//at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
//at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
//at java.lang.Thread.run(Thread.java:748)
//100.0
//25.0
//33.0
//50.0
}
}
import java.util.concurrent.*;
/**
* 扩展TraceThreadPoolExecutor,让它在调度任务前先保存一下提交任务线程的堆栈信息
*/
public class TraceThreadPoolExecutor extends ThreadPoolExecutor {
public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
public void execute(Runnable task) {
super.execute(wrap(task,clientTrace(),Thread.currentThread().getName()));
}
@Override
public Future<?> submit(Runnable task) {
return super.submit(wrap(task,clientTrace(),Thread.currentThread().getName()));
}
private Exception clientTrace(){
return new Exception("Client stack trace");
}
private Runnable wrap(final Runnable task,final Exception clientTrace,String clientThreadName){
return () -> {
try {
task.run();
} catch (Exception e) {
clientTrace.printStackTrace();
throw e;
}
};
}
}
来源:https://blog.csdn.net/x356982611/article/details/96147628


猜你喜欢
- 本文实例分析了C#中登录窗体和欢迎窗体关闭方法。分享给大家供大家参考。具体分析如下:在c#的winform编程中,我们经常会做登录窗体或欢迎
- 以前的Android(4.1之前的版本)中,SDcard路径通过“/sdcard”或者“/mnt/sdcard”来表示,而在JellyBea
- 本文,将介绍如何通过Java后端程序代码在PDF中创建工具提示。添加工具提示后,当鼠标悬停在页面上的元素时,将显示工具提示内容。导入jar包
- Java * 。具体有如下四步骤:通过实现 InvocationHandler 接口创建自己的调用处理器;通过为 Proxy 类指定 C
- 一、Drools引擎简介1、基础简介Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形
- 本文实例讲述了C#模拟Http与Https请求框架类。分享给大家供大家参考。具体实现方法如下:using System.Text;using
- 马云说:“未来最大的资源就是数据,不参与大数据十年后一定会后悔。”毕竟出自wuli马大大之口,今年二月份我开始了学习大数据的道路,直到现在对
- 本文实例讲述了Java实现的求逆矩阵算法。分享给大家供大家参考,具体如下:package demo;public class MatrixI
- spring-mybatis获取mapper方式汇总项目背景:pojo下面有一个user实体类Dao包下面写了usermapper.xml
- Android 实现获取手机里面的所有图片详解及实例实现代码:public class MainActivity extends Activ
- 本文实例讲述了Android编程实现自定义手势的方法。分享给大家供大家参考,具体如下:之前介绍过如何在Android程序中使用手势,主要是系
- 本文实例为大家分享了Unity Shader序列帧动画效果的具体代码,供大家参考,具体内容如下 实现原理主要的思想是设置显示UV
- 目录I. 环境配置1. 项目配置2. 数据库表II. 参数传递1. @Param注解2. 单参数3. 多参数3. Map传参4. POJO对
- 以前用序列化都是一些方法需要才实现的,后来业务需求要深拷贝才去研究。参阅了别人博客得出一些总结。序列化是为了把Java对象转化为字节序列(字
- 在前面的文章中有介绍到我们在微信web开发过程中常常用到的 【微信JSSDK中Config配置】 ,但是我们在真正的使用中我们不仅仅只是为了
- 第 1 步:将这个 Spring Boot 项目的打包方式设置为 war。<packaging>war</packagin
- 前言上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了解过数据库的同学应该会知道,
- 一、IDEA自带打包插件内容:此种方式可以自己选择制作胖包或者瘦包,但推荐此种方式制作瘦包。输出:输出目录在out目录下流程步骤:第一步:
- FormClosing事件在窗体关闭时,FormClosing事件发生。此事件会得到处理。从而释放与窗体相关的所有资源。如果取消此事件,则窗
- 前言使用过SpringBoot的都应该知道,一个SpringBoot 项目就是由一个一个 Starter 组成的,一个 Starter 代表