2016-01-28 2 views
2

У меня есть процесс jvm, который постоянно потребляет одно процессорное ядро. Я проверил java-потоки и, похоже, не работает, поэтому кажется, что загрузка происходит из встроенного потока.изучить jvm высокий уровень использования процессора

Я пытался использовать pstack: pstack <thread_id>, но он вернулся мне список адресов, которые не очень полезны:

#0 0x00007fcc33c2b694 in ??() 
#1 0x00007fcc3011f540 in ??() 
#2 0x00007fcc2c032710 in ??() 
#3 0x00007fcc3011f560 in ??() 
#4 0x00007fcc33c6eaa0 in ??() 
#5 0x00007fcc3011f560 in ??() 
#6 0x00007fcc3011f7f0 in ??() 
#7 0x00007fcc346414d0 in ??() 
#8 0x00007fcc34641bf8 in ??() 
#9 0x00007fcc3011f570 in ??() 
#10 0x00007fcc33c83618 in ??() 
#11 0x00007fcc3011f5a0 in ??() 
#12 0x00007fcc33c6ea66 in ??() 
#13 0x00000006b73ce4b0 in ??() 
#14 0x00007fcc3011f7f0 in ??() 

Что я могу делать дальше? Насколько я понимаю, может быть полезно использовать символы для преобразования аддонов в читаемые имена, но я не уверен, существуют ли они для jvm.

Другой вариант - попросить jvm распечатать внутреннее состояние, но я не уверен, существуют ли такие команды.

Любая информация оценивается.

Я использую 1.7.0_80 JDK:

# ./java -version 
java version "1.7.0_80" 
Java(TM) SE Runtime Environment (build 1.7.0_80-b15) 
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) 

в докер (1.9.1) контейнера:

# uname -a 
Linux 259307ada273 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 
+2

Вы можете рассказать о своем процессе? 10 секунд снимка будет достаточно, чтобы определить, есть ли метод, который постоянно работает – AdamSkywalker

ответ

1

pstack требует символов, для JIT-кода они недоступны. Вместо этого вы можете использовать jstack, который получает необходимую информацию во время выполнения.

Кроме того, для получения символов могут использоваться профилировщики java, такие как jmc, jprofiler или yourkit - linux perf tools, так как они могут использовать perf-map-agent.

2

Лучшим бесплатным инструментом, который поставляется вместе с JVM, является Flight Recorder в Mission Control, то есть jmc Он имеет намного более низкие служебные данные и, как правило, более мелкие детали, включая расположение распределений объектов.

Если у вас высокая загрузка процессора, я обычно начинаю с размещения объектов, так как обычно это дает быстрые выигрыши. Только после того, как ставки распределения были очищены, я просматриваю профилирование ЦП.

Java 8 имеет лучшую версию Mission Control 5.5, хотя Java 7 все еще работает нормально.

Смежные вопросы