技术文章 - CS247546

如何处理 Windchill 中的线程安全问题

已修改: 09-May-2023   


注意:本文已使用机器翻译软件翻译,以方便非英语客户阅读。但翻译内容可能包含语法错误或不准确之处。请注意, PTC对本文所含信息的翻译准确性及使用后果不承担任何责任。请在 此处 查看本文的英文原始版本以便参考。有关机器翻译的更多详情,请单击 此处
感谢您告诉我们。我们将尽快审阅此译文。

适用于

  • Windchill PDMLink 6.2 to 12.1

说明

  • 什么是线程安全问题(也称为并发问题或竞争条件)
  • 在 Windchill 系统上观察到高且持续的 CPU 使用率
  • 观察到一个或多个线程在访问非线程安全的对象(例如 HashMap、
  • 查看从 Windchill 捕获的线程转储,可以使用以下规则发现挂起的线程
    • 堆栈跟踪显示代码当前正在访问非线程安全对象(例如 HashMap、HashSet、ArrayList)
    • CPU 用户时间增加自上次状态以来花费的时间量(即 100% 的 1 个 CPU 或更少,如果此数量的 CPU 资源不可用)
    • 字节分配值不随时间变化
    • 操作永远不会完成
  • 下面是一个示例,显示了通过捕获 2 个后续线程转储可见的一次典型问题的演变
    • 第一个线程转储的提取显示 HashMap.getEntry 中有问题的线程:
“ajp-bio-8011-exec-6”Id=129 daemon prio=5 RUNNABLE
阻止(cnt):35714;等待 (cnt): 32780
CPU 纳米:256245725053586;用户纳米:254639820000000;分配的字节数:558960941120
Servlet 请求:10gd6vh;ihca5tzc;16546;ov2qsw;3024310;方法上下文:10gd6vh;ihca5tzc;16546;ov2qsw;3024313
在 java.util.HashMap.getEntry(HashMap.java:469)
在 java.util.HashMap.containsKey(HashMap.java:453)
在 com.ptc.wvs.server.loader.PartGenericStructure.getNextSiblingNumber(PartGenericStructure.java:2138)
  • 第二个线程转储的提取物显示有问题的线程仍在对 HashMap.getEntry 的调用中。仅观察 CPU nanos / User nanos 在增加。分配的字节没有变化。由于它使用 100% CPU,因此时间通常会增加 2 个线程转储之间经过的时间量。
“ajp-bio-8011-exec-6”Id=129 daemon prio=5 RUNNABLE
阻止(cnt):35714;等待 (cnt): 32780
CPU 纳米:256257725053586;用户纳米:254651820000000;分配的字节数:558960941120
Servlet 请求:10gd6vh;ihca5tzc;16546;ov2qsw;3024310;方法上下文:10gd6vh;ihca5tzc;16546;ov2qsw;3024313
在 java.util.HashMap.getEntry(HashMap.java:469)
在 java.util.HashMap.containsKey(HashMap.java:453)
在 com.ptc.wvs.server.loader.PartGenericStructure.getNextSiblingNumber(PartGenericStructure.java:2138)
这是文章 247546 的 PDF 版本,可能已过期。最新版本 CS247546