Я заметил, что при воспроизведении звука в Java этап MarkSweepCompact в gc слишком длинный и приводит к коротким периодам молчания, что недопустимо. Поэтому мне нужно использовать gc с низкой паузой. Я пробовал Parallel и CMS, они, кажется, работают лучше, потому что я полагаю, что пауза короче, и они не выполняют полный сбор так часто, как по умолчанию.
До сих пор я тестировал свою программу со следующими параметрами ParallelGC: * 1003 *
-XX:+UseParallelGC
-XX:MaxGCPauseMillis=70
и для ConcurrentMarkSweep:
-XX:+UseConcMarkSweepGC
-XX:+CMSIncrementalMode
-XX:+CMSIncrementalPacing
Я также попробовал G1GC, но он все еще экспериментален в Java 6. Опции для обоих режимов:
-Xms15m
-Xmx40m
-XX:+UnlockExperimentalVMOptions
-XX:+CMSClassUnloadingEnabled
-XX:+TieredCompilation
-XX:+AggressiveOpts
-XX:+UseAdaptiveSizePolicy
-Dsun.java2d.noddraw=false
-Dswing.aatext=true
-XX:MaxPermSize=25m
-XX:MaxHeapFreeRatio=10
-XX:MinHeapFreeRatio=10
Какой GC лучше в этой ситуации? Можно ли оптимизировать какие-либо из этих параметров для лучшей производительности процессора и минимального использования памяти?
РЕДАКТИРОВАТЬ Чтобы распознать паузу, я записываю время записи аудиоданных в выходную строку, обычно оно составляет от 92 до 120 мс (я пишу 16384 байта = ~ 92 мс), объявление, когда Full GC запустить, это 200+ мс:
65.424: [Full GC (System) [PSYoungGen: 872K->0K(2432K)] [PSOldGen: 12475K->12905K(16960K)] 13348K->12905K(19392K) [PSPermGen: 15051K->15051K(22272K)], 0.2145081 secs] [Times: user=0.20 sys=0.00, real=0.21 secs]
Was writing 16384 bytes, time to write 263 ms
EDIT2 Шаблон размещения для моего приложения следующий: он загружает кучу объектов при запуске, затем начинает играть, и я предполагаю, что большинство объектов после этого выделяются графическим интерфейсом, потому что просмотр / приостановка звук не сильно меняет график ГХ. Вот что VisualGC показывает с параллельным GC:
График начинается при запуске, и я начинаю воспроизведение. Помечены
1) задержка звука и полный gc, думаю, увеличилось Старый размер:
101.646: [Full GC [PSYoungGen: 64K->0K(6848K)] [PSOldGen: 15792K->12773K(19328K)] 15856K->12773K(26176K) [PSPermGen: 15042K->14898K(23808K)], 0.2411479 secs] [Times: user=0.19 sys=0.00, real=0.24 secs]
2) Я открываю окно приложения и приостанавливаю воспроизведение. На самом деле ничего не меняется, чуть позже увеличивается размер eden.
3) Я открываю окна и снова начинаю воспроизведение.
Так мне нужно увеличить выделенный размер Old Gen? Как я могу это сделать? Я бегу с -XX: NewRatio = 10 и -XX: NewSize = 10m
Спасибо.