Pat*_*ins 2 java memory garbage-collection jvm
我知道更大的堆意味着更长的GC暂停.我没关系 - 我的代码正在对一些数据进行分析,而我所关心的只是最大限度地减少了进行垃圾收集所花费的时间,单个暂停的长度对我没有影响.
可以使堆太大伤害性能?我的理解是"年轻"对象很快得到GC,但"旧"对象可能需要更长时间,所以我担心大堆会将一些短期对象推入更长寿的空间.我做了大量快速丢弃的字符串分配(在单次运行过程中大约为60 GB),所以我不想增加用于那些的GC时间.
我正在使用8 GB RAM的机器上进行测试,所以我一直在运行我的代码-Xms4g -Xmx4g,并且在我上次运行的配置文件中,我花了大约20%的运行时进行垃圾收集.我发现将堆增加到5 gb有助于减少它.生产服务器将具有32 GB的RAM,并且内存要求更高.
我可以安全地运行它-Xms31g -Xmx31g,或者最终可能会损害性能吗?
可以使堆太大伤害性能?
超过31 GB时,您可能会丢失CompressedOops,这意味着您必须跳转到48 GB才能获得更多可用内存.如果可以的话,我会尽量保持在31 GB以下.
我的理解是"年轻"对象很快得到GC,但"旧"对象可能需要更长时间,所以我担心大堆会将一些短期对象推入更长寿的空间.
出于这个原因,我倾向于拥有大量的年轻代,例如高达24 GB.
我可以使用-Xms31g -Xmx31g安全地运行它,还是最终会损害性能?
在32 GB的机器上,这将是非常糟糕的.当您包含JVM使用的关闭堆,操作系统,磁盘缓存时,您可能会发现超过24-28 GB的堆会损害性能.我将从24 GB开始,看看如何,如果5 GB运行正常,你可能会发现你可以减少它会产生很小的影响.
您可能会发现将数据移出堆将有助于GC时间.我已经运行了1 GB堆和800 GB堆的系统,但它取决于您的应用程序要求.
我花了大约20%的运行时进行垃圾收集
我建议你降低分配率.使用内存分析器可以将分配率降低到300 MB/s以下,但小于30 MB/s会更好.对于极端系统,您可能需要不到1 GB /小时,因为这样您可以在没有次要集合的情况下全天运行.