Назад | Перейти на главную страницу

Инструменты и советы по устранению неполадок Sun JVM

Мы запускаем кластер серверов ColdFusion 8 поверх Sun JVM версии 1.6.0_11. Иногда сервер просто перестает отвечать на запросы. На данный момент мы определили, что JVM блокируется и что ни ColdFusion, ни IIS не являются корнем проблемы. Я включил наши аргументы JVM ниже. Какие дополнительные настройки JVM мы должны рассмотреть? Какие-либо инструменты для мониторинга, отслеживания или получения метрик внутри JVM, чтобы мы могли видеть, что он делает в случае сбоев? Какие-либо другие советы по устранению неполадок JVM?

-server
-Xms1024m
-Xmx1024m
-Dsun.io.useCanonCaches=false
-XX:MaxPermSize=256m
-XX:PermSize=256m
-XX:+UseParallelGC
-Dsun.rmi.dgc.client.gcInterval=300000
-Dsun.rmi.dgc.server.gcInterval=300000
-Djmx.invoke.getters=true

Это стандартный вариант для моего конфига:

-XX:+HeapDumpOnOutOfMemoryError 

У меня также есть мониторинг SNMP / RRD основных характеристик работоспособности JVM (например, размер кучи, количество потоков) ... и многое другое.

Затем есть целый мир инструментов, таких как jconsole ...

Если вы работаете в Linux, вы можете использовать kill -3 для получения дампа потока и поиска тупиковых ситуаций, используя Анализатор дампа потоков.

VisualVM теперь поставляется как часть JDK и может использоваться для мониторинга использования памяти, потоков, а также включает профилировщик.

jmap может использоваться для получения гистограмм и дампов кучи из процессов Java. Затем вы можете использовать такой инструмент, как Анализатор памяти Eclipse исследовать это.

Как упоминалось в другом ответе, вы можете изучить JMX и JConsole. Для каждой службы в нашем приложении у нас есть MBean, поэтому мы можем просматривать статистику ключей, такую ​​как размеры очереди, чтобы проверить, не кажется ли что-нибудь необычным.

Вам нужно изучить JMX мониторинг - он может дать вам хорошее представление о том, что происходит внутри JVM.

Для начала добавьте -Dcom.sun.management.jmxremote.port = portNun в список выше. Затем на другом компьютере запустите jconsole и скажите ему подключиться к машине и порту, которые вы указали выше. Поищите где угодно и посмотрите, какие потоки работают и что происходит после того, как он перестал отвечать на запросы.

jvmstat помогал мне в прошлом, хотя я не думаю, что использовал его с CF 8 / JRE 1.6. У него есть хорошее отображение того, что находится в каждом поколении, поэтому вы можете увидеть, не вызывают ли проблемы некоторые из ваших переменных памяти.

вы можете использовать jstat, чтобы увидеть использование кучи.

jstat -gc -h10 -t 1000