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