5

我的问题是,JVM 是否共享某种与线程或进程相关的资源,这些资源可能会导致 ProcessBuilder 性能在正常使用一个月或更长时间后飙升?对所有应用程序使用 java 6 update 21。

在过去的几个月里,我们注意到我们数据中心的一台服务器(运行 Solaris 10 的 Sparc M4000)可以运行大约 6-8 周而没有问题。然而,很快,使用 ProcessBuilder 类来运行脚本的应用程序的性能会受到巨大的影响 - ProcessBuilder.start 有时需要一分钟以上才能返回。重新启动后以及几周后,正常返回时间在 10 秒或 100 毫秒范围内。

我编写了一个单独的小应用程序,它创建了 5 个线程,每个线程使用 ProcessBuilder 连续运行 'ls' 命令 10 次,然后我从中收集统计信息以监控原始问题。此应用程序在每次运行后退出,并且每小时仅从 cron 运行一次。通常只需要一两秒钟。

昨晚,经过 45 天的正常运行时间和正常行为后,每个 ProcessBuilder.start 调用的 ProcessBuilder 时间再次飙升至超过一分钟。

顶部显示没有内存或 CPU 占用。我确实尝试在测试应用程序上执行 jstack,但收到错误“无法创建 thread_db 代理”。

有任何想法吗?

4

1 回答 1

4

我们在 Linux 中运行的应用程序也遇到了类似的问题。Linux JVM 代码使用分叉,这意味着每次执行时都会映射和复制地址空间。我们正在执行许多小型短期流程。与您的应用程序的主要区别似乎是我们有一个相对较大的堆(大约 240GB),所以我确信这会产生影响。我们最终使用 JNI 和 posix spawn 实现了我们自己的生成代码。这是问题/答案的链接:Slowing process creation under java

于 2011-02-04T02:43:30.523 回答