我的问题是,JVM是否会分享某些与线程或进程相关的资源,这些资源可能导致ProcessBuilder性能在正常使用一个月或更长时间后出现峰值?为所有应用程序使用java 6 update 21。
在过去几个月中,我们注意到我们数据中心的单个服务器(运行Solaris 10的Sparc M4000)可以在大约6-8周内完成,没有任何问题。但是,很快,使用ProcessBuilder类运行脚本的应用程序的性能会受到巨大的性能影响 - ProcessBuilder.start有时需要花费一分钟才能返回。重新启动后,几周后,正常返回时间在10秒或100毫秒范围内。
我写了一个单独的小应用程序,创建了5个线程,每个线程使用ProcessBuilder连续10次运行'ls'命令,然后我从中收集统计数据以监控原始问题。此应用程序在每次运行后退出,并且每小时仅从cron运行一次。通常只需要一两秒钟。
昨晚,在45天的正常运行时间和正常行为之后,每次进行ProcessBuilder.start调用时,ProcessBuilder的时间再次超过一分钟。
top显示没有内存或CPU占用。我确实尝试在测试应用程序上执行jstack,但得到错误'无法创建thread_db代理'。
有什么想法吗?
答案 0 :(得分:4)
我们在Linux上运行的应用程序遇到了类似的问题。 Linux JVM代码使用fork,这意味着每次执行时都会映射和复制地址空间。我们正在执行许多小的短期流程。与您的应用程序的主要区别似乎是我们有一个相对较大的堆(大约240GB)所以我确信它会产生影响。我们最终使用JNI和posix spawn实现了我们自己的产卵代码。以下是问题/答案的链接:Slowing process creation under java