我的问题是,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 代理”。
有任何想法吗?