请选择 进入手机版 | 继续访问电脑版

[java] 打印Java程序的线程栈信息方式

[复制链接]
查看134 | 回复14 | 2021-9-12 20:12:43 | 显示全部楼层 |阅读模式

打印Java程序的线程栈信息

jstack可以得知当火线 程的运行环境

安装jstack等下令 集,jstack是开发 版本jdk的一部分,不是开发 版的有大概 找不到

  1. yum install -y java-1.8.0-openjdk-devel
复制代码

查看要打印堆栈的java历程 ID

  1. jps -l
复制代码

打印堆栈

  1. sudo -u admin jstack pid > jstack.txt
复制代码

特别 要注意 的是jstack必要 使用 与历程 划一 的用户才能精确 导出堆栈,否则会报错如下

  1. Unable to open socket file: target process not responding or HotSpot VM not loaded
复制代码

线程池非常 堆栈的坑

  1. import java.util.concurrent.*;
  2. public class DivTask implements Runnable{
  3. int a,b;
  4. public DivTask(int a, int b) {
  5. this.a = a;
  6. this.b = b;
  7. }
  8. @Override
  9. public void run() {
  10. double re = a/b;
  11. System.out.println(re);
  12. }
  13. public static void main(String[] args) throws InterruptedException, ExecutionException {
  14. // ThreadPoolExecutor executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS
  15. // , new SynchronousQueue<>());
  16. TraceThreadPoolExecutor executor = new TraceThreadPoolExecutor(0, Integer.MAX_VALUE, 0L, TimeUnit.SECONDS
  17. , new SynchronousQueue<>()); //扩展TraceThreadPoolExecutor
  18. for (int i = 0; i < 5; i++) {
  19. // executor.submit(new DivTask(100,i));
  20. //改进方式一:
  21. //Future re = executor.submit(new DivTask(100, i));
  22. //re.get();
  23. //改进方式二:
  24. executor.execute(new DivTask(100,i));
  25. }
  26. //100.0
  27. //25.0
  28. //33.0
  29. //50.0
  30. //其中100/0的异常结果没打印
  31. //线程池很有可能"吃掉程序抛出的异常
  32. //改进方式一:
  33. //Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
  34. // at java.util.concurrent.FutureTask.report(FutureTask.java:122)
  35. // at java.util.concurrent.FutureTask.get(FutureTask.java:192)
  36. //。。。
  37. //改进方式二:
  38. //Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
  39. // at com.Test.DivTask.run(DivTask.java:15)
  40. // at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  41. // at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  42. // at java.lang.Thread.run(Thread.java:748)
  43. //100.0
  44. //33.0
  45. //25.0
  46. //50.0
  47. //扩展TraceThreadPoolExecutor
  48. //java.lang.Exception: Client stack trace
  49. // at com.Test.TraceThreadPoolExecutor.clientTrace(TraceThreadPoolExecutor.java:20)
  50. // at com.Test.TraceThreadPoolExecutor.execute(TraceThreadPoolExecutor.java:12)
  51. // at com.Test.DivTask.main(DivTask.java:29)
  52. //Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
  53. // at com.Test.DivTask.run(DivTask.java:15)
  54. // at com.Test.TraceThreadPoolExecutor.lambda$wrap$0(TraceThreadPoolExecutor.java:25)
  55. // at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  56. // at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  57. // at java.lang.Thread.run(Thread.java:748)
  58. //100.0
  59. //25.0
  60. //33.0
  61. //50.0
  62. }
  63. }
复制代码
  1. import java.util.concurrent.*;
  2. /**
  3. * 扩展TraceThreadPoolExecutor,让它在调度任务前先保存一下提交任务线程的堆栈信息
  4. */
  5. public class TraceThreadPoolExecutor extends ThreadPoolExecutor {
  6. public TraceThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
  7. super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
  8. }
  9. @Override
  10. public void execute(Runnable task) {
  11. super.execute(wrap(task,clientTrace(),Thread.currentThread().getName()));
  12. }
  13. @Override
  14. public Future<?> submit(Runnable task) {
  15. return super.submit(wrap(task,clientTrace(),Thread.currentThread().getName()));
  16. }
  17. private Exception clientTrace(){
  18. return new Exception("Client stack trace");
  19. }
  20. private Runnable wrap(final Runnable task,final Exception clientTrace,String clientThreadName){
  21. return () -> {
  22. try {
  23. task.run();
  24. } catch (Exception e) {
  25. clientTrace.printStackTrace();
  26. throw e;
  27. }
  28. };
  29. }
  30. }
复制代码

以上为个人履历 ,盼望 能给大家一个参考,也盼望 大家多多支持脚本之家。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 困虫斗倜 | 2021-9-13 00:12:35 | 显示全部楼层
我只看看不说话。。。
回复

使用道具 举报

avatar 清风哥 | 2021-9-19 14:47:31 | 显示全部楼层
admin楼主人气很旺!
回复

使用道具 举报

avatar 漠河龙哥 | 2021-9-25 09:53:01 | 显示全部楼层
太高深了,理解力不够用了!
回复

使用道具 举报

avatar 123456848 | 2021-9-25 09:53:04 | 显示全部楼层
宇宙第一贴诞生了!
回复

使用道具 举报

avatar 标题超过5个字 | 2021-9-26 23:01:38 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 淑侠 | 2021-9-27 12:42:08 | 显示全部楼层
我和我的小伙伴都惊呆了!
回复

使用道具 举报

avatar 北右酝 | 2021-10-10 04:15:57 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

admin楼主病的不轻啊!
回复

使用道具 举报

今天皮痒了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则