|
|
1
23
关于CMS,我学到的第一件事是它需要比其他收藏家更多的内存,大约25%到50%以上是一个很好的起点。这有助于避免碎片,因为CMS不会像stop-world收集器那样进行任何压缩。第二,做一些有助于垃圾收集者的事情;整数值而不是新的整数,去掉匿名类,确保内部类没有访问不可访问的东西(在外部类中是私有的)诸如此类的东西。垃圾越少越好。查找bugs并且不忽略警告将对此有很大帮助。 至于调整,我发现您需要尝试以下几点:
告诉JVM在永久gen中使用CMS。 固定堆的大小:-Xmx2048m-Xms2048m这可以防止GC执行诸如增长和收缩堆之类的操作。 -二十: +UseParNewGC使用 年轻一代使用并行而不是串行采集。这将加快你的小收集,特别是如果你有一个非常大的年轻一代配置。年轻一代人一般都是好的,但不要超过老一代人的一半。 -二十: 并行CMSThreads=X
-二十: +CMSParallelRemarkEnabled默认为serial,这样可以加快速度。 -二十: +CMSIncrementalMode允许应用程序通过在阶段之间使用GC来运行更多的程序 -二十: +CMSIncrementalPacing允许JVM计算随时间变化的收集频率
-二十: CMSIncrementalDutyCycle=X从这%的时间执行GC开始 -二十: CMSIncrementalSafetyFactor=X
-二十: CMSFullGCsBeforeCompaction=1 这个很重要。它告诉CMS收集器总是在开始新的收集之前完成收集。如果没有这个,你可能会遇到这样的情况:它扔掉一堆工作,然后重新开始。
默认情况下,CMS会让你的PermGen增长,直到它在几周后杀死你的应用程序。这就停止了。如果你利用反射,或者滥用反射,你的永久性头发只会增长String.实习生,或者用类加载器做一些不好的事情,或者其他一些事情。 幸存者比率和保存时间也可以使用,这取决于你是否有长寿命的对象,以及你可以在幸存者空间之间复制多少对象。如果你知道你的所有对象都会留下来,你可以配置零大小的幸存者空间,任何幸存下来的年轻一代收集将立即终身。 |
|
|
2
12
引自 "Understanding Concurrent Mark Sweep Garbage Collector Logs"
但是,如果应用程序中确实存在内存泄漏,那么这只是在争取时间。 如果你需要快速重新启动和恢复,并喜欢一个'死快'的方法,我建议不要使用CMS在所有。我会坚持'-XX:+usepallelgc'。 从 "Garbage Collector Ergonomics"
|
|
|
3
4
CMS失败不会(据我所知)导致OOM。相反,CMS失败是因为JVM需要太快地执行太多的集合,而CMS无法跟上。在短时间内发生大量收集周期的一种情况是堆几乎已满。 很长的时间听起来很奇怪。。。但如果你的机器在剧烈地摇晃,理论上是可能的。然而,如果你的堆快满了,那么长时间的重复GCs是很有可能的。
编辑
-这样做的选择是
|
|
|
4
0
我发现使用
|
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
H3007 · 并发运行python子进程似乎不是并发的 1 年前 |
|
|
The Oddler · TVar会阻止读取直到更改吗? 1 年前 |
|
|
Wang Tuma · 使用信号量的c++并发问题:按顺序打印 1 年前 |
|
|
Marcel Batista · 在不同线程中更新密钥时的字典线程安全 2 年前 |
|
|
rico · 当volatile关键字真的是必要的? 2 年前 |