在 Mac OSX 5.8 上,我有一个 Java 程序,它以 100% CPU 运行很长一段时间——几天或更长时间(它是一个分析并发程序的模型检查器,所以这或多或少是预期的)。然而,它的虚拟内存大小(如 OSX 的活动监视器中所示)在一天左右后变得巨大:现在为 16GB,并且还在不断增长。物理内存使用量大致稳定在1.1GB左右。
我想知道:16GB(并且不断增长)是否是可能导致我的程序变慢的问题的迹象?
I start the program with "java -Xmx1024m -ea"
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-9M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)
感谢大家的建议。我将尝试一些答案中给出的分析建议,然后回来(由于多天的运行时间,可能需要一段时间)。
为了回答下面的一些问题,模型检查器几乎不执行 I/O(仅打印语句,具体取决于调试设置)。在我使用的模式下,它没有 GUI。我不是模型检查器的主要作者(尽管我已经研究过它的一些内部结构),但我不相信它使用了 JNI。[
额外的虚拟内存并没有导致模型检查器死掉,但是根据打印输出的频率,随着虚拟内存使用量的增加,它的运行速度逐渐变得越来越慢。 (不过,也许这只是因为垃圾收集越来越多。)我计划周一在 Windows 机器上尝试一下,看看是否会出现同样的问题。
一点额外的解释:我正在运行的模型检查器 (JPF) 本身就是一个几乎完整的 JVM(完全用 Java 编写),在 Oracle/Sun 的 JVM 下运行。当然,作为一个虚拟机,JPF对于支持模型检查是高度专业化的。
这有点违反直觉,但这意味着即使我正在模型检查的程序被设计为多线程,但就 Sun 的 JVM 而言,只有一个线程:运行 JPF 的线程。 JPF 模拟我的程序所需的线程,作为其模型检查过程的一部分。
我相信Stephen C已经指出了问题所在; Roland Illig 给了我验证它的工具。我对JNI的使用是错误的。 JPF 本身不使用 JNI,但它允许插件,并且 JNI 由配置的插件之一使用。幸运的是,我可以使用纯 Java 的等效插件。其中之一的初步使用表明,在过去几个小时内虚拟内存没有增长。感谢大家的帮助。