Мы запускаем кластер серверов 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