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 查看各实例内存占用情况