【发布时间】:2010-12-11 17:37:12
【问题描述】:
我有一个 Java 程序,用于跨多个处理器进行一组科学计算,方法是将其分成几部分并在不同的线程中运行每一部分。这个问题是微不足道的,因此线程之间没有争用或通信。他们访问的唯一常见数据是一些不需要同步访问的共享静态缓存,以及硬盘驱动器上的一些数据文件。线程也不断地写入磁盘,但写入单独的文件。
我的问题是,有时当我运行程序时,我的速度非常快,而有时当我运行完全相同的程序时,它运行得非常慢。如果我看到它运行缓慢并且 ctrl-C 并重新启动它,它通常会再次开始快速运行。它似乎在运行的早期就将自己设置为慢速模式或快速模式,并且从不在模式之间切换。
我已将它连接到 jconsole,它似乎不是内存问题。当我发现它运行缓慢时,我尝试将探查器连接到它,但探查器无法连接。我尝试使用 -Xprof 运行,但慢速运行和快速运行之间的转储似乎并没有太大不同。我也尝试过使用不同的垃圾收集器和不同大小的内存空间。
我的机器是带有条带 RAID 分区的 mac pro。无论是慢还是快,cpu 的使用率都不会下降,如果线程花费太多时间阻塞从磁盘读取,你会预料到,所以我认为这不会是磁盘读取问题。
我的问题是,我的代码有哪些类型的问题会导致这种情况?或者这可能是操作系统问题?我无法在 Windows 机器上复制它,但我没有具有类似 RAID 设置的 Windows 机器。
【问题讨论】:
-
尝试使用“java -server”运行,也许它随机选择不使用JIT?以及如何确保不同的线程在不同的处理器/内核上运行?
-
@Piligrim,如果他使用的是 Mac OS X Snow Leopard,它默认带有 64 位 Java 6,他已经在使用服务器版本。如果 JVM 随机选择不使用 JIT,那就太奇怪了——这不是一个现实的场景……
-
是的,我一直在使用 -d64,它显然取代了 -server。
-
我会尝试继续使用分析器选项。连接后,它应该会在测试的几分钟内识别出问题。
-
我能够复制减速并连接visualvm。当我连接时它运行缓慢,但在连接分析器后不久,它又加速了!以前从未这样做过。我认为它必须以某种方式进入垃圾收集器的退化案例。连接探查器将其从循环中剔除。有人知道这可能是什么吗?我正在使用 16 gigs 的最小和最大堆大小。
标签: java multithreading macos osx-snow-leopard operating-system