我的问题是,JVM是否共享一些与线程或进程相关的资源,这些资源可能会导致ProcessBuilder性能在正常使用一个月或更长时间后达到峰值?所有应用程序都使用java 6 update 21。
在过去的几个月里,我们注意到我们数据中心的一台服务器(运行Solaris10的Sparc M4000 )可以运行6-8周而没有任何问题。但是,很快地,使用ProcessBuilder类运行脚本的应用程序的性能会受到巨大的性能影响- ProcessBuilder.start有时需要一分钟以上的时间才能返回。在重新启动之后的几周内,正常的返回时间在10秒或100毫秒范围内。
我写了一个单独的小应用程序,它创建了5个线程,每个线程使用ProcessBuilder连续运行'ls‘命令10次,然后我收集其中的统计数据,以便监视原始问题。此应用程序在每次运行后退出,并且每小时仅从cron运行一次。这通常只需要一两秒钟。
昨晚,在45天的正常运行时间和正常行为之后,每次ProcessBuilder.start调用的ProcessBuilder时间再次上升到一分钟以上。
顶部显示没有内存或CPU占用。我确实尝试在测试应用程序上执行jstack,但得到错误消息“Can‘t create thread_db agent”。
有什么想法吗?
发布于 2011-02-04 10:43:31
我们在Linux上运行的应用程序也遇到了类似的问题。Linux JVM代码使用fork,这意味着每次执行时都会映射和复制地址空间。我们正在执行许多小的、生命周期短的进程。这似乎与你的应用程序的主要区别是我们有一个相对较大的堆(大约240 It ),所以我相信这是有影响的。我们最终使用JNI和posix派生实现了自己的派生代码。以下是问题/答案的链接:Slowing process creation under java
https://stackoverflow.com/questions/4820231
复制相似问题