OOM实例

1. 使用Executors.newFixedThreadPool()方法,当不断创建新任务,而任务执行速度比创建速度慢时,任务对象就会在任务队列里面排队,堆内存得不到释放,导致OOM;

2. 使用PreparedStatement时,未调用close()方法,导致对象无法回收(即使没有对象引用),最终导致OOM。

JDBC中,如果ResultSet 和 Statement 不关闭的话,会有什么影响

如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。

但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

jvm监控常用命令:

jstat -gcutil pid 1000 1000
第一个1000表示多长时间打印一次内存信息
后面一个1000表示打印多少次

jstack pid 查看线程

jmap -heap pid 查看堆内存

jmap -histo:live pid 查看各实例内存占用情况

上一篇:WCF技术剖析之二十一:WCF基本异常处理模式[中篇]


下一篇:PHP学习笔记 - 入门篇(2)