我有一个Java Web应用程序可以运行大约2天。之后,它会因OOM堆空间错误而挂起。
线程转储提供有关堆的以下信息:
堆新一代总计38336K,使用38181K [0x00000000d5a00000,0x00000000d8390000,0x00000000d8390000)
eden space 34112K,100%使用[0x00000000d5a00000,0x00000000d7b50000,0x00000000d7b50000) 从空间4224K,96%使用[0x00000000d7b50000,0x00000000d7f49628,0x00000000d7f70000) 空间4224K,0%使用[0x00000000d7f70000,0x00000000d7f70000,0x00000000d8390000) 并发标记扫描生成总计481728K,使用481727K [0x00000000d8390000,0x00000000f5a00000,0x00000000f5a00000) concurrent-mark-sweep perm gen total 38172K,使用22900K [0x00000000f5a00000,0x00000000f7f47000,0x0000000100000000]
我创建了一个我用VisualVM读取的heapdump。这告诉我,有大量(120万)StatementImpl实例占用了大量内存。
有关申请的一些信息:
所有插入和过程调用分为16个连接。我从不关闭连接,因为我一直在使用它们。我百分百肯定会关闭所有陈述和准备好的陈述。
可能是大量StatementImpl实例的原因是什么?