我们最近一直在使用以下配置测试G1垃圾收集器:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseG1GC -XX:MaxGCPauseMillis=1250 -XX:+PrintTenuringDistribution -Xloggc:${logdir}/gc-$(日期+%Y_%m_%d-%H_%M).log -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics -XX:+PrintPromotionFailure -XX:+PrintAdaptiveSizePolicy -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=15 -XX:ParallelGCThreads=8:
我们最近遇到了一个问题,两个java进程在一个有48 GB RAM的机器上运行上述配置,两个进程都消耗了大约20 - 22 GB的RAM (几个小进程消耗了剩余的内存),从而填满了整个RAM,然后它触发了磁盘交换,最终导致OOM和进程被杀死。
这似乎令人担忧,因为NMT既没有以有意义的方式报告这种内存使用情况,我们也没有从GC日志中获得任何关于这种使用情况的线索。在NMT统计数据中,应用程序内存低于16G,元空间使用率低于1G。
我们曾尝试将maxMetaSpaceSize设置为2G,但也无济于事。当进程连续运行几天时,RAM使用率似乎会无限增长。
从其他问题看,G1垃圾收集器似乎确实倾向于消耗更多的内存,但磁盘交换是一个令人担忧的问题。有人能就如何解决这个问题提供一些建议吗?
发布于 2017-08-17 16:00:19
至于渴望得到评论,我把它作为一个答案。
这是一个很好的读物,它解释了why a java process might consume more memory than -Xmx。根据我们提供的信息,我相信这也是你方的原因。
对于G1,有一个OBE Getting Started with the G1 Garbage Collector,其中包含有关G1GC功能的详细信息。请看一下Recommended Use Cases for G1。也许您不会从使用G1中受益。
引用自OBE (Oracle By EE)
如果您使用的是CMS或ParallelOldGC,并且您的应用程序没有遇到长时间的垃圾回收暂停,那么使用当前的收集器是很好的。
发布于 2017-11-18 07:53:05
G1,Parallel,ConcMarkSweep,Serial和Shenandoah垃圾收集器在伸缩性和资源消耗方面的Here you can find testing results,以及关于可以应用哪些设置来改善结果的一些建议。因此,您可以选择最适合您的项目,并减少内存使用。
https://stackoverflow.com/questions/45725812
复制相似问题