【发布时间】:2011-06-13 08:02:18
【问题描述】:
我注意到在 java 中播放音频时,gc 中的 MarkSweepCompact 阶段太长,导致短暂的静音,这是不可接受的。所以我需要使用低暂停 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 更好?是否可以优化这些设置以实现最佳 CPU 性能和最小内存使用量?
EDIT 为了识别暂停,我记录了将音频数据写入输出线的时间,通常在 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 我的应用程序的分配模式如下:它在启动时加载一堆对象,然后开始播放,我猜之后的大部分对象都是由 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) 我打开应用程序窗口并暂停播放。没有什么真正改变,稍后它会增加伊甸园的大小。
3) 我打开窗口并重新开始播放。
所以我需要增加分配的旧代大小?我怎么做?我正在运行 -XX:NewRatio=10 和 -XX:NewSize=10m
谢谢。
【问题讨论】:
标签: java performance audio garbage-collection