Java的OutOfMemoryError
关键字: outofmemoryerror
Java中不再需要关心Object(相对C++而言这的确省去了许多烦恼)生存期管理,因为我们有了垃圾收集器GC! 引入GC带来了效率,我们专心编写业务逻辑而不必随 时为内存管理问题担忧。不过,在Java中如果程序设计有误,对于简单的问题也会导致新问题出现,这就是OutOfMemoryError(简称OOM)。
举几个例子。
1. 文件上传类。由于没有考虑到大文件的情况,这个类在上传大文件时会抛OOM错误。原来代码中直接 new Byte[filesize]。一下子在堆上申请这么多内存能不出错吗?
2. 一个含有大量图形类的UI界面。每次刷新时都要把整个背景new ImageIcon,当界面为了显示级联关系非常多的N个图形时,这个ImageIcon的size非常之大,并且由于界面的repaint事件发生比较 频繁,以至于连续申请ImageIcon时导致OOM错误。
3. 执行一条SQL语句,从数据库查出32183条记录,返回一个长度32183的对象数组。由服务器(中间件)传回UI端,出现OOM。在反序列化的过程实 际上也是在new Object。关于反序列化及readObject请参阅effective in Java。
4. 考虑把界面上110万单元格(5667行,197列)的数据导出到EXCEL文件
通过配置Java Plugin 参数,我们的程序性能得以改善但不能解决OOM。但是多数情况下,OOM是因为我们忽视了问题的潜在规模。有时候也因为太简单太贪婪的代码(一次申请太多的内存)导致,再有就是无意识的内存泄漏问题
解决途径:1. 生产者-消费者模型+内存池
2. 消除已确认的内存泄漏问题
3. 在设计和编程时就开始关注性能问题。