Ответ 1
Именно сам jconsole вызывает шаблон zig zag.
Чтобы увидеть эффект jconsole
или jvisualvm
вы можете написать простую java-программу только с основным контуром. Например
public static void main(String[] args) {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
}
Выполните его только с небольшой кучей java -Xmx20m...
Это поможет вам лучше увидеть использование кучи, потому что инструмент jstat
я буду использовать далее, печатает использование в процентах.
Теперь откройте окно командной строки и выполните jstat
. Вам понадобится PID java-процесса и вы сможете найти его с помощью jps -l
.
jstat -gcutil <PID>
он распечатает что-то вроде этого
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 0,00 69,34 0,00 14,48 17,19 0 0,000 0 0,000 0,000
Сосредоточьтесь на Эдем пространстве E
. Значение представляет собой процентное значение емкости пространства. Посмотрите на jstat для деталей.
Если вы выполните команду снова и снова, вы увидите, что использование пространства eden не будет расти. Он сохраняется, например, на уровне 69,34
. Я использую команду linux watch, например, в моих окнах, чтобы перезапустить команду с определенным интервалом. Смотрите watch.bat
Теперь откройте jconsole
jconsole <PID>
и выполнить команду jstat
снова и снова. Вы увидите, что пространство eden постоянно растет до тех пор, пока макс не будет достигнуто, и это сбор мусора.
Вот мой вывод jstat --gcutil <PID>
с интервалом в 1 секунду. Сосредоточьтесь на Эдем пространстве E
.
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 0,00 67,42 0,00 14,48 17,19 0 0,000 0 0,000 0,000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 0,00 67,42 0,00 14,48 17,19 0 0,000 0 0,000 0,000
# jconsole connected
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 81,64 7,57 92,26 84,87 1 0,001 0 0,000 0,001
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 84,66 7,57 92,26 84,87 1 0,001 0 0,000 0,001
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 89,70 7,57 92,26 84,87 1 0,001 0 0,000 0,001
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 91,70 7,57 92,26 84,87 1 0,001 0 0,000 0,001
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 93,70 7,57 92,26 84,87 1 0,001 0 0,000 0,001
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 95,70 7,57 92,26 84,87 1 0,001 0 0,000 0,001
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 96,70 7,57 92,26 84,87 1 0,001 0 0,000 0,001
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 96,88 98,71 7,57 92,26 84,87 1 0,001 0 0,000 0,001
# Garbage collected
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
100,00 0,00 1,13 14,06 94,75 89,26 2 0,003 0 0,000 0,003
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
100,00 0,00 3,00 14,06 94,75 89,26 2 0,003 0 0,000 0,003
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
100,00 0,00 5,75 14,06 94,75 89,26 2 0,003 0 0,000 0,003
Как вы можете видеть... После того, как jconsole подключился к процессу, пространство eden растет и растет, пока не собрано мусор. Это приводит к созданию зигзагообразного рисунка. Вот снимок от jvisualvm
.
Вы обнаружите аналогичное поведение, когда будете делать то же самое с процессом tomcat. Единственным отличием будет то, что пространство eden растет очень немного, даже если никакой jconsole не подключен. Но этот незначительный рост не является причиной для зигзагообразного рисунка, который вы видите.
Вот результат jstat
для моего tomcat.
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,33 4,81 96,85 90,10 5 0,037 0 0,000 0,037
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,33 4,81 96,85 90,10 5 0,037 0 0,000 0,037
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,43 4,81 96,85 90,10 5 0,037 0 0,000 0,037
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,43 4,81 96,85 90,10 5 0,037 0 0,000 0,037
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,43 4,81 96,85 90,10 5 0,037 0 0,000 0,037
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
этот выход продолжается в течение 36 секунд, пока вы не увидите небольшое изменение памяти. От 70,43
до 70,53
.
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,43 4,81 96,85 90,10 5 0,037 0 0,000 0,037
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,53 4,81 96,85 90,10 5 0,037 0 0,000 0,037
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0,00 99,80 70,53 4,81 96,85 90,10 5 0,037 0 0,000 0,037
Таким образом, это небольшое изменение - единственное, за что отвечают фоновые процессы tomcat.
PS: Вы также можете время от времени использовать Memory Analyzer и дайверы кучи памяти, и вы увидите, что количество используемой памяти для byte[]
увеличивается, из-за сетевого трафика RMI.