首页 > 解决方案 > 多线程 Java 应用程序有时无法获取 Websphere 上的所有线程

问题描述

我有一个详尽的 Java 应用程序(JRE 1.8.0_201),需要在线程中执行,它部署在 IBM Websphere 9 上。

在 WAS 启动时,应用程序执行似乎很好,但有时多线程功能会丢失,并且只使用一个线程执行。

如果我们再次重新启动 websphere,情况就会恢复正常,执行将再次使用适当的并行线程。

是否有一些我缺少的 WAS 配置?或在java或操作系统端?

下面是 Linux 上的硬件架构:

标签: javalinuxmultithreadingwebsphere

解决方案


要获得有关问题的最大信息:

线程转储

创建 JVM 中所有线程的当前状态的列表。建议在几十秒/分钟内重复执行此列表(在不同名称的输出中,不要覆盖您的转储),在您的情况下可能是几个小时。这使您可以捕获更改和可能的死锁。如果没有任何改变并且线程在同一行,那么可能有问题。

如何制作线程转储:

打开控制台(CMD),使用“cd”命令切换到“/Java/jdkx.x.x_xx /bin”(JDK)。然后输入“jstack JVM_PID > /thread_dump_1”。将“JVM_PID”替换为正在运行的 JVM 的进程 ID(任务管理器 - 详细信息 - PID 列)。

您还可以使用 VisualVM 之类的工具进行线程转储:

在此处输入图像描述

如何读取线程转储:

好文章:https ://dzone.com/articles/how-to-read-a-thread-dump

寻找阻塞和等待的线程。可能会有多个线程卡在同一行,只有一个线程取得了一些进展。

在您的情况下如何读取线程转储:

我会在重新启动后立即进行一些线程转储,然后在出现问题时进行。如果您可以区分一个线程何时结束而另一个线程何时获得进展,我将制作另一个线程转储并比较它们(在第一次结束之前和第二次开始工作之后)。


推荐阅读