java - 在 Solaris 下需要有关 Java ProcessBuilder 性能的帮助

标签 java multithreading solaris processbuilder

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

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

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

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

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

有什么想法吗?

最佳答案

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

关于java - 在 Solaris 下需要有关 Java ProcessBuilder 性能的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4820231/

相关文章:

java - JSP/MySQL - 格式化不

java - 为什么 JList 的 fireContentsChanged 调用会卡住整个 GUI?

java - 在 ConcurrentHashMap 中存储复杂对象

solaris - mmap会使用连续内存吗? (在 Solaris 上)

c++ - fopen 产生 NULL 文件指针 Solaris

java - 从一字节文件读取返回 0xEF 0xBF 0xBD

java - Spring JPA 自动扫描 jar 文件中的实体

c++ - 单线程程序明显使用多核

c++ - 使用哪个版本的 libstdc++.so.6?

Java - 神经网络中的标称属性标准化和非标准化