В Mac OSX 5.8 у меня есть Java-программа, которая работает на 100% CPU очень долгое время - несколько дней или более (это средство проверки моделей, анализирующее параллельную программу, так что это более или менее ожидаемо). Тем не менее, объем виртуальной памяти, как показано в Activity Monitor OSX, становится огромным через день или около того: сейчас он составляет 16 ГБ и продолжает расти. Использование физической памяти примерно стабильно на уровне 1,1 ГБ или около того.
Я хотел бы знать: является ли 16 ГБ (и растет) признаком проблем, которые могут замедлить мою программу?
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)
Спасибо всем за их предложения. Я попробую предложения по профилированию, приведенные в некоторых ответах, и вернусь (это может занять некоторое время из-за многодневного времени выполнения).
В ответ на некоторые из приведенных ниже моментов средство проверки модели практически не выполняет ввод-вывод (только операторы печати, в зависимости от настроек отладки). В режиме я использую это не имеет GUI. Я не являюсь основным автором средства проверки модели (хотя я работал над некоторыми из его внутренних компонентов), но я не верю, что он использует JNI. [<--- edit: это неправильно, подробности ниже] не делает никакого отображения памяти. Кроме того, я не прошу JVM Oracle / Sun создавать множество потоков (объяснение см. Ниже). </p>
Дополнительная виртуальная память не привела к прекращению работы средства проверки модели, но в зависимости от частоты вывода на печать она постепенно работает все медленнее по мере увеличения использования виртуальной памяти. (Возможно, это только из-за все большего и большего сбора мусора.) Я планирую попробовать его на компьютере с Windows в понедельник, чтобы проверить, не возникает ли такая же проблема.
Небольшое дополнительное объяснение: средство проверки моделей (JPF), которое я запускаю, само по себе является почти полной JVM (полностью написанной на Java), работающей под управлением Oracle / Sun JVM. Конечно, как виртуальная машина, JPF очень специализирован для поддержки проверки моделей.
Это немного нелогично, но это означает, что даже несмотря на то, что программа, которую я проверяю на модели, рассчитана на многопоточность, для JVM от Sun существует только один поток: тот, который выполняет JPF. JPF эмулирует потоки, в которых нуждается моя программа, как часть процесса проверки модели.
Я полагаю, что Стивен С. определил проблему; Роланд Иллиг дал мне инструменты, чтобы проверить это. Я был неправ насчет использования JNI. Сам JPF не использует JNI, но он позволяет подключаемые модули, а JNI использовался одним из настроенных подключаемых модулей. К счастью, есть эквивалентные плагины, которые я могу использовать, которые являются чистой Java. Предварительное использование одного из них не показывает роста виртуальной памяти за последние несколько часов. Спасибо всем за помощь.