为什么要抛出OOM?

时间:2017-02-13 12:28:34

标签: java memory jvm

这是server1的堆内存信息

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1073741824 (1024.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 157286400 (150.0MB)
   MaxPermSize      = 157286400 (150.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 19922944 (19.0MB)
   used     = 19911792 (18.989364624023438MB)
   free     = 11152 (0.0106353759765625MB)
   99.94402433696546% used
From Space:
   capacity = 12517376 (11.9375MB)
   used     = 0 (0.0MB)
   free     = 12517376 (11.9375MB)
   0.0% used
To Space:
   capacity = 13303808 (12.6875MB)
   used     = 0 (0.0MB)
   free     = 13303808 (12.6875MB)
   0.0% used
PS Old Generation
   capacity = 715849728 (682.6875MB)
   used     = 715848480 (682.6863098144531MB)
   free     = 1248 (0.001190185546875MB)
   99.99982566173442% used
PS Perm Generation
   capacity = 157286400 (150.0MB)
   used     = 79364440 (75.68782806396484MB)
   free     = 77921960 (74.31217193603516MB)
   50.45855204264323% used

我为JVM堆分配了1024M内存,但是当OOM

时JVM没有耗尽内存

我有另一台服务器,接下来是服务器的堆内存信息,当它是OOM

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1073741824 (1024.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 157286400 (150.0MB)
   MaxPermSize      = 157286400 (150.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 119341056 (113.8125MB)
   used     = 119253176 (113.72869110107422MB)
   free     = 87880 (0.08380889892578125MB)
   99.92636230736889% used
From Space:
   capacity = 111869952 (106.6875MB)
   used     = 0 (0.0MB)
   free     = 111869952 (106.6875MB)
   0.0% used
To Space:
   capacity = 111149056 (106.0MB)
   used     = 0 (0.0MB)
   free     = 111149056 (106.0MB)
   0.0% used
PS Old Generation
   capacity = 715849728 (682.6875MB)
   used     = 715849720 (682.6874923706055MB)
   free     = 8 (7.62939453125E-6MB)
   99.99999888244702% used
PS Perm Generation
   capacity = 157286400 (150.0MB)
   used     = 110605624 (105.48174285888672MB)
   free     = 46680776 (44.51825714111328MB)
   70.32116190592448% used

这台服务器看起来很简单,内存真实不够

谁可以提供有关server1 OOM的明确说明

2 个答案:

答案 0 :(得分:1)

正如弗拉基米尔所说 - 你已经满了OldGen,你应该检查NewRatio和Survivor比率。您还可以使用gc日志启动应用程序,并在外部工具中进行分析,例如:http://gceasy.io(免费)或JClarity Censum(付费)

通过提供标志启用gc日志:  -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -Xloggc:gc.log

答案 1 :(得分:0)

你有一个I: Locally disabling undefined-variable (E0602),这意味着GC应该在这个时候开始。理想情况下,您的终身空间应该小于这个百分比。

旧版本似乎是682 MB,这意味着它应该至少为682 / 0.4或1700 MB(超过您的总数),但我怀疑如果允许应用程序运行它真的需要更高更长的时间。

如果这个数字令人惊讶,我建议您使用内存分析器查看是否有内存泄漏,或者可以减少内存消耗。