内存泄漏问题总结

在处理大量数据更新时,程序出现内存溢出问题。初始认为是内存不足,增大堆内存后仍出现同样问题。通过jvisualvm和jhat分析,发现循环中预编译SQL对象(PreparedStatement)和结果集(ResultSet)未正确关闭,且被静态变量引用导致内存泄漏。即使将对象设为null,只要Connection未关闭,相关对象无法被垃圾回收。最终发现,当整个数据处理完毕,Connection关闭后,内存才得到释放。
摘要由CSDN通过智能技术生成
  1. 同事有一个带有少量业务逻辑然后更新数据库某字段的需求(大约900万数据)
  2. 执行了几千条后,发现日志停住了。
  3. 使用jvisualvm查看GC,发现Old区和Eden区都已经满了
  4. 第一反应是可能存在内存泄漏,但是看到系统初始化参数里面最大堆内存大小只有512M,就觉得调大堆内存就应该可以了。
  5. 所以把堆内存大小调整为4G,Eden区2G,重启,正常运行了
  6. 第二天早上看日志,发现又停了,日志报内存溢出。查看GC,Old和Eden又满了
  7. 一定是有内存泄漏
  8. show me the code:
public class UpdateUtil {
   

    private static final Logger logger = LoggerFactory.getLogger(UpdateUtil.class);

    static String sql = null;
    static Connection con = DBHelper.getDBHelper();
    static ResultSet ret = null;
    static PreparedStatement pst = null;

    public static void 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值