包装类的性能真的差么?

最近项目有一个问题。导出数据到excel的时候经常抛出heap space内存溢出异常。经过确认,是用户频繁点击导出按钮导致。

但是我很好奇这些数据到底占用了多少空间。我们的程序逻辑大概是这样的:从数据库中取出数据,组装成模型(Mybatis完成)-——将模型映射到POi  Row 对象,将模型的域映射到Poi的 cell对象,导入到excel—— response返回excel文件。

我检视了一下模型类发现其中使用了大量Byte,Integer这样的包装类,问了下写这部分代码的同事,他说是使用某mybatis插件生成的。于是我想起了之前<<effective Java>>中的内容。


于是我做了一下测试,将模型类的所有包装类域替换成了基本类型。测试方法是,取6W条数据生成6W个模型类。然后不断通过设置JVM参数,不断减小内存。记录抛出Heap Space异常时的最大内存。

然而结果却并不像我想的那样。 无论是用基本类型还是包装类,都是在500M内存左右抛出的异常。

于是我又复习了一下<<effective Java>>,看了一下他的示例。并且请教了一下别人。




我发现项目的代码和书上的代码有两点不同。第一,项目中虽然使用了包装类,但是并没有频繁的使用auto-boxing和unboxing。第二,项目中的包装类型的域,大部分是类似枚举的值。只有1,2,0这样几个数字。查阅资料可知Integer中-128到127返回的都是单例(详见打开链接)。而书上却是各不相同的值。

可见,在一定的条件下,包装类并没有比基本类型性能,空间差出很多。我似乎也没理由因此阻止同事使用插件生成模型类。

并不是说书上说的不对,然而多去试验,多去思考肯定是有收获的。

本人才疏学浅,测试的手法可能存在问题,本篇中也加入了很多自己的猜测。欢迎提出异议和指点。


至于项目的问题,我也想到了几个解决方案,比如分次抓取数据,分次渲染。这样虽然增加了访问数据库的次数,但是渲染完的模型对象可以回收,能及时的释放内存。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值