我正在研究一个完全用Java编写的内存数据库.我们有一个输入源,它为系统提供数据,这就是提取/加载阶段.在运行这个时,我注意到JVM正在挂起,其根本原因是Full GC被触发.然后应用程序冻结,然后出现OutOfMemory错误(GC Overhead Limit Exceeded)
检查GC日志显示了很多垃圾收集,包括年轻人和老年人.令人惊讶的一件事是Desired Survivor的规模是负面的.我想知道为什么会这样?有没有人遇到过这个?
环境:
Sun JDK版本: 1.7.0_13-b20(64位)
JVM设置:
GC日志摘录(这不是完整日志):
0.666:[GC所需幸存者大小178913280字节,新阈值7(最大15)[PSYoungGen:524289K-> 4431K(30583488K)] 524289K-> 4503K(100488576K),0.0052536秒] [时间:用户= 0.03 sys = 0.00,真实= 0.01秒]
0.671:[全GC(系统)[PSYoungGen:4431K-> 0K(30583488K)] [ParOldGen:72K-> 4096K(69905088K)] 4503K-> 4096K(100488576K)[PSPermGen:8852K-> 8847K(21248K)],0.0853597 secs] [次:用户= 0.08 sys = 0.00,实际= 0.09秒]
12.306:[GC所需幸存者大小178913280字节,新阈值7(最大15)[PSYoungGen:26214464K-> 389676K(30583488K)] 26218560K-> 393868K(100488576K),0.1907519秒] [时间:用户= 0.69 sys = 0.69,真实= 0.19秒]
19.845:[GC所需幸存者大小178913280字节,新阈值7(最大15)[PSYoungGen:26604140K-> 4369012K(30583488K)] 26608334K-> 4539738K(100488576K),2.0671426秒] [时间:用户= 12.67 sys = …