Я заметил, что при воспроизведении звука в java этап MarkSweepCompact в gc слишком длинный и приводит к коротким периодам молчания, что неприемлемо. Поэтому мне нужно использовать низкую паузу gc. Я пробовал Parallel и CMS, они, похоже, работают лучше, потому что я полагаю, что пауза короче, и они не выполняют полную коллекцию так часто, как по умолчанию.Настройка звукового сопровождения GC для Java
До сих пор я проверил свою программу со следующими параметрами для 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 байт = ~ 92ms), объявление, когда 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 распределения шаблон для моего приложения является следующее: он загружает кучу объектов при запуске, то он начинает играть, и я предполагаю, что большинство объектов после этого выделяется графическим интерфейсом, потому что просмотр/приостановка звука не сильно меняет график GC. Это то, что visualgc показывает с параллельным gc:
График начинается при запуске, и я начинаю воспроизведение. Меченые являются
1) задержки звука и полный дс, я думаю, что он вырос старый размер:
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
Спасибо.
Да, я ограничен памяти, это аудиоплеер, он не должен использовать более 30-40 Мб. Как правило, моя куча примерно наполовину заполнена. –
visualgc - отличный инструмент, спасибо, я обновил вопрос с помощью графика visualgc. –