`
zerozone
  • 浏览: 203068 次
  • 来自: 北京
社区版块
存档分类
最新评论

Java的OutOfMemoryError

    博客分类:
  • Java
阅读更多

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. 在设计和编程时就开始关注性能问题。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics