Я заметил, что при воспроизведении звука в java, этап MarkSweepCompact в gc слишком длинный и приводит к коротким периодам молчания, что неприемлемо. Поэтому мне нужно использовать низкую паузу gc. Я пробовал Parallel и CMS, они, похоже, работают лучше, потому что я предполагаю, что пауза короче, и они не выполняют полную коллекцию так часто, как по умолчанию.
До сих пор я тестировал свою программу со следующими параметрами для ParallelGC:
-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 лучше в этой ситуации? Может ли любой из этих параметров быть оптимизирован для лучшей производительности процессора и минимального использования памяти?
EDIT Чтобы распознать паузу, я записываю время для записи аудиоданных на выходную строку, обычно от 92 до 120 мс (я пишу 16384 байта = ~ 92 мс), объявление, когда Full GC, 200+ ms:
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 Шаблон распределения для моего приложения следующий: он загружает кучу объектов при запуске, затем начинает воспроизведение, и я думаю, что большинство объектов после этого выделяются gui, поскольку просмотр/приостановка звука не очень сильно меняет график GC. Это то, что 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) Я открываю окна и снова запускаю воспроизведение.
Итак, мне нужно увеличить размер старого генерала? Как мне это сделать? Я работаю с -XX: NewRatio = 10 и -XX: NewSize = 10m
Спасибо.