我有一个Java Web应用程序运行良好约2天 . 之后它会挂起OOM堆空间错误 .

线程转储提供有关堆的以下信息:

堆新生代总计38336K,使用38181K [0x00000000d5a00000,0x00000000d8390000,0x00000000d8390000] eden空间34112K,100%使用[0x00000000d5a00000,0x00000000d7b50000,0x00000000d7b50000]从空间4224K,96%使用[0x00000000d7b50000,0x00000000d7f49628,0x00000000d7f70000]到空间4224K,0 %使用[0x00000000d7f70000,0x00000000d7f70000,0x00000000d8390000]并发标记扫描生成总计481728K,使用481727K [0x00000000d8390000,0x00000000f5a00000,0x00000000f5a00000]并发标记扫描perm gen总计38172K,使用22900K [0x00000000f5a00000,0x00000000f7f47000,0x0000000100000000)

我创建了一个我用VisualVM读取的heapdump . 这告诉我,有大量(120万)StatementImpl实例占用了大量内存 .

有关应用程序的一些信息:

  • 16个sql连接

  • 32每秒插入语句

  • 每秒约200个过程调用

所有插入和过程调用分为16个连接 . 我从不关闭连接,因为我一直在使用它们 . 我100%肯定会关闭所有语句和PreparedStatements .

可能是大量StatementImpl实例的原因是什么?