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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值