我们最近使用以下配置测试了G1垃圾收集器:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseG1GC -XX:MaxGCPauseMillis=1250 -XX:+PrintTenuringDistribution -Xloggc:${logdir}/gc-$(date +%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 -XX:+ParallelRefProcEnabled -XX:G1HeapRegionSize=8M JAVA_OPTS_HEAP: -Xms16g -Xmx16g
我们最近遇到一个问题,即在具有48 GB RAM的计算机上运行两个使用以上配置的Java进程,这两个进程都会消耗大约20-22 GB的RAM(其余内存由几个小进程占用),从而填满整个RAM,然后触发磁盘交换,最终导致OOM并杀死进程。
这似乎令人担忧,因为NMT没有以有意义的方式报告此内存使用情况,我们也无法从GC日志中获得有关此使用情况的任何线索。在NMT统计数据中,应用程序内存不足16G,元空间使用率不足1G。
我们尝试将maxMetaSpaceSize设置为2G,但这也没有帮助。当进程运行数天时,RAM使用似乎会无限增长。
从其他问题中可以看出,G1垃圾收集器确实倾向于消耗更多的内存,但磁盘交换是一个令人担忧的问题。请问有人能提供一些指针,以解决此问题吗?
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseG1GC -XX:MaxGCPauseMillis=1250 -XX:+PrintTenuringDistribution -Xloggc:${logdir}/gc-$(date +%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 -XX:+ParallelRefProcEnabled -XX:G1HeapRegionSize=8M JAVA_OPTS_HEAP: -Xms16g -Xmx16g
我们最近遇到一个问题,即在具有48 GB RAM的计算机上运行两个使用以上配置的Java进程,这两个进程都会消耗大约20-22 GB的RAM(其余内存由几个小进程占用),从而填满整个RAM,然后触发磁盘交换,最终导致OOM并杀死进程。
这似乎令人担忧,因为NMT没有以有意义的方式报告此内存使用情况,我们也无法从GC日志中获得有关此使用情况的任何线索。在NMT统计数据中,应用程序内存不足16G,元空间使用率不足1G。
我们尝试将maxMetaSpaceSize设置为2G,但这也没有帮助。当进程运行数天时,RAM使用似乎会无限增长。
从其他问题中可以看出,G1垃圾收集器确实倾向于消耗更多的内存,但磁盘交换是一个令人担忧的问题。请问有人能提供一些指针,以解决此问题吗?