Программа Java с виртуальной памятью 16 ГБ и растущая: это проблема?

В Mac OSX 5.8 у меня есть программа Java, которая работает на 100% ЦП в течение очень долгого времени - несколько дней или более (это средство проверки моделей, анализирующее параллельную программу, так что это более или менее ожидаемое ). Однако размер его виртуальной памяти, как показано в 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)

Спасибо всем за их предложения. Я попробую предложения по профилированию, приведенные в некоторых ответах, и вернусь (это может занять некоторое время из-за многодневного времени выполнения).

В ответ на некоторые из пунктов ниже, средство проверки модели почти не выполняет операций ввода-вывода (только операторы печати, в зависимости от настроек отладки). В том режиме, который я использую, у него нет графического интерфейса. Я не являюсь основным автором программы проверки моделей (хотя я работал над некоторыми ее внутренними компонентами), но я не верю, что она каким-либо образом использует JNI. [<--- edit: это неверно, подробности ниже] Это не выполняет отображение памяти. Кроме того, я не прошу JVM Oracle / Sun создавать множество потоков (объяснение см. Ниже).

Дополнительная виртуальная память не привела к прекращению работы средства проверки модели, но, исходя из частоты вывода на печать, она постепенно работает все медленнее и медленнее по мере увеличения использования виртуальной памяти. (Возможно, это просто из-за того, что сборка мусора все больше и больше.) Я планирую попробовать это на машине Windows в понедельник, чтобы увидеть, не возникает ли та же проблема.

Небольшое дополнительное объяснение: программа проверки моделей, которую я использую (JPF) представляет собой почти полную JVM (полностью написанную на Java), работающую под JVM Oracle / Sun. Конечно, как виртуальная машина, JPF очень специализирована для поддержки проверки моделей.

Это немного противоречит здравому смыслу, но это означает, что, хотя программа, которую я проверяю модели, предназначена для многопоточной обработки, в JVM Sun существует только один поток: тот, который выполняет JPF. JPF эмулирует потоки, которые нужны моей программе, как часть процесса проверки модели.


Я считаю, что Стивен С. точно определил проблему; Роланд Иллиг дал мне инструменты для проверки. Я ошибался насчет использования JNI. Сам JPF не использует JNI, но позволяет использовать плагины, а JNI использовался одним из настроенных плагинов. К счастью, я могу использовать эквивалентные плагины на чистой Java. Предварительное использование одного из них не показывает роста виртуальной памяти за последние несколько часов. Спасибо всем за помощь.

5
задан David 5 June 2011 в 20:56
поделиться