我们有一个大型Java应用程序在Google Cloud Managed VMs上运行(这限制了我们控制JVM调整参数的能力)。
我们在RAM中有数百万个对象(大约15GB)。
在执行可能涉及创建数万个对象的任务(解析一个巨大的Excel)时,系统可能由于垃圾收集而冻结了几分钟。
我们注意到总体上我们的RAM并不低,但是ParOldGen
似乎使用了99%。有什么建议如何避免这种情况?
Heap
PSYoungGen total 6083072K, used 267497K [0x000000064eb00000, 0x0000000800000000, 0x0000000800000000)
eden space 6078464K, 4% used [0x000000064eb00000,0x000000065f03a438,0x00000007c1b00000)
from space 4608K, 0% used [0x00000007c1b00000,0x00000007c1b00000,0x00000007c1f80000)
to space 528384K, 0% used [0x00000007dfc00000,0x00000007dfc00000,0x0000000800000000)
ParOldGen total 14198272K, used 14197939K [0x00000002ec180000, 0x000000064eb00000, 0x000000064eb00000)
object space 14198272K, 99% used [0x00000002ec180000,0x000000064eaacc60,0x000000064eb00000)
PSPermGen total 65536K, used 50669K [0x00000002e1b80000, 0x00000002e5b80000, 0x00000002ec180000)
object space 65536K, 77% used [0x00000002e1b80000,0x00000002e4cfb640,0x00000002e5b80000)
最佳答案
如this article on Java GC中所述,ParOldGen(或并发的旧Gen(标记扫描)GC)在处理内存中的大量碎片时可能会花费很长时间,这是您希望在这种情况下看到的。重对象模式。也许值得一读来解释正在发生的事情?
对于increasing the heap size,这可以通过JVM选项来完成,可以在使用“定制运行时” /“灵活环境”应用程序时对其进行操作。您也可以configure the amount of memory each instance will have。
最后,您还可以使用JVM选项select which GC algorithms should run。您可能会发现完全没有ParOldGen的情况下,该应用程序的性能会更好。