Для этого урока мы создали простую Java-программу, которая позволит вам изучить эту технику шаг за шагом.
Инструменты для устранения неполадок
Следующие инструменты будут использоваться ниже для этого урока:
- Windows Process Explorer (для определения участников с большим потоком CPU)
- Дамп JVM-потока (для корреляции потоков и анализа первопричин на уровне кода)
Java-программа с высоким процессором
Простая программа ниже просто зацикливает и создает новые объекты String. Это позволит нам выполнить этот процессор для анализа потоков. Я рекомендую вам импортировать его в IDE по вашему выбору, например, в Eclipse, и запустить его оттуда. Вы должны наблюдать увеличение ЦП на вашем компьютере с Windows, как только вы его запустите.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package org.ph.javaee.tool.cpu; /** * HighCPUSimulator * @author Pierre-Hugues Charbonneau * */ public class HighCPUSimulator { private final static int NB_ITERATIONS = 500000000 ; // ~1 KB data footprint private final static String DATA_PREFIX = "datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatad atadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata datadatadatadatadatadatadata"; /** * @param args */ public static void main(String[] args) { System.out.println( "HIGH CPU Simulator 1.0" ); System.out.println( "Author: Pierre-Hugues Charbonneau" ); try { for ( int i = 0 ; i < NB_ITERATIONS; i++) { // Perform some String manipulations to slowdown and expose looping process... String data = DATA_PREFIX + i; } } catch (Throwable any) { System.out.println( "Unexpected Exception! " + any.getMessage() + " [" + any + "]" ); } System.out.println( "HighCPUSimulator done!" ); } } |
Шаг № 1 — Запустите Process Explorer
Инструмент Process Explorer визуально отображает загрузку процессора динамически. Это хорошо для анализа в реальном времени. Если вам нужны исторические данные о ЦП для каждого потока, вы также можете использовать Windows perfmon со счетчиками данных% Processor Time & Thread Id. Вы можете скачать Process Explorer по ссылке ниже:
http://technet.microsoft.com/en-us/sysinternals/bb896653
В нашем примере вы можете видеть, что процесс Eclipse javaw.exe теперь использует ~ 25% общего использования ЦП после выполнения нашего примера программы.
Шаг № 2 — Запустите представление Process Explorer Threads
Следующим шагом является отображение представления Threads процесса javaw.exe. Просто щелкните правой кнопкой мыши по процессу javaw.exe и выберите «Свойства». Представление Threads будет открыто в соответствии с приведенным ниже снимком:
- Первый столбец — Идентификатор потока (десятичный формат)
- Второй столбец — это загрузка ЦП, используемая каждым потоком.
- Третий столбец также является другим счетчиком, указывающим, работает ли поток на процессоре
В нашем примере мы видим, что наш основной виновник — Thread Id # 5996, использующий ~ 25% ЦП.
Шаг № 3 — Генерация дампа потока JVM
На этом этапе Process Explorer больше не будет полезен. Цель состояла в том, чтобы определить один или несколько потоков Java, потребляющих большую часть загрузки ЦП процесса Java, чего мы и добились. Чтобы перейти к следующему уровню в своем анализе, вам нужно захватить дамп потока JVM. Это позволит вам сопоставить идентификатор потока с трассировкой стека потоков, чтобы вы могли точно определить, какой тип обработки потребляет такой высокий ЦП.
Генерация дампа потоков JVM может быть выполнена несколькими способами. Если вы используете JRockit VM, вы можете просто использовать инструмент jrcmd, как показано ниже:
Когда у вас есть данные Thread Dump, просто найдите Thread Id и найдите интересующую вас трассировку стека потоков.
В нашем примере нить «Main Thread», которая была запущена из Eclipse, стала основным виновником, что мы и хотели продемонстрировать.
1
2
3
4
5
|
Main Thread id =1 idx=0x4 tid=5996 prio=5 alive, native_blocked at org /ph/javaee/tool/cpu/HighCPUSimulator .main (HighCPUSimulator.java:31) at jrockit /vm/RNI .c2java(IIIII)V(Native Method) -- end of trace |
Шаг № 4 — Проанализируйте виновника стека трассировки и определите основную причину
На этом этапе у вас должно быть все, что вам нужно для продвижения анализа причин. Вам необходимо просмотреть каждую трассировку стека потоков и определить тип проблемы, с которой вы сталкиваетесь. На этом последнем шаге вы обычно проводите большую часть своего времени, и проблема может быть простой, такой как бесконечный цикл, или сложной, такой как проблемы, связанные со сборкой мусора.
В нашем примере, Thread Dump обнаружил, что высокая загрузка ЦП происходит из нашей образца Java-программы в строке 31. Как и ожидалось, он обнаружил условие зацикливания, которое мы специально разработали для этого урока.
1
2
3
4
|
for ( int i = 0 ; i < NB_ITERATIONS; i++) { // Perform some String manipulations to slowdown and expose looping process... String data = DATA_PREFIX + i; } |
Я надеюсь, что это руководство помогло вам понять, как вы можете проанализировать и помочь определить основную причину проблем с процессором Java в ОС Windows. Пожалуйста, следите за обновлениями, в следующей статье вы найдете руководство по устранению неполадок с процессором Java, в том числе о том, как выполнить последний шаг анализа, а также о типичных проблемных схемах.
Справка: анализ ЦП Java Thread в Windows от нашего партнера по JCG Пьера-Хьюга Шарбонно из блога Учебные пособия по Java EE и учебник по Java .