java - 多线程 Java 应用程序有时无法获取 Websphere 上的所有线程
问题描述
我有一个详尽的 Java 应用程序(JRE 1.8.0_201),需要在线程中执行,它部署在 IBM Websphere 9 上。
在 WAS 启动时,应用程序执行似乎很好,但有时多线程功能会丢失,并且只使用一个线程执行。
如果我们再次重新启动 websphere,情况就会恢复正常,执行将再次使用适当的并行线程。
是否有一些我缺少的 WAS 配置?或在java或操作系统端?
下面是 Linux 上的硬件架构:
- 架构:x86_64
- CPU 操作模式 (s):32 位、64 位
- 字节顺序:小尾数
- CPU (s): 4
- 在线 CPU (s) 列表:0-3
- 每个内核的线程数:1
- 每个插槽的核心数:1
- 插座:4
解决方案
要获得有关问题的最大信息:
线程转储
创建 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
寻找阻塞和等待的线程。可能会有多个线程卡在同一行,只有一个线程取得了一些进展。
在您的情况下如何读取线程转储:
我会在重新启动后立即进行一些线程转储,然后在出现问题时进行。如果您可以区分一个线程何时结束而另一个线程何时获得进展,我将制作另一个线程转储并比较它们(在第一次结束之前和第二次开始工作之后)。
推荐阅读
- vue.js - 删除时间线(v-timeline)Vuetify的'start-line'和'end-line'
- google-apps-script - 如何在 Google 表格中为 =filter 添加“或”
- assembly - 在 Lab14.exe 中的 0x00091021 处引发异常:0xC0000005:访问冲突读取位置 0x00124000
- ios - 在哪里可以找到@c NSError.userInfo 字典
- python - Python合并两个DataFrames只检索结果中的特定列
- bash - 如果它们在bash中并排,如何替换2个字符?
- python - 成功安装 OpenCV,但无法在模块中导入
- r - 是否可以以优先考虑更高级别因子的方式合并两个有序因子列?
- c# - 如何在控制器端使用等效的@Html.RouteLink
- bash - dyld:惰性符号绑定失败:未找到符号