美文网首页
记一次LinkedList引起的内存爆炸

记一次LinkedList引起的内存爆炸

作者: 一条来路不归路 | 来源:发表于2020-10-05 13:54 被阅读0次

有一个程序,有一段逻辑中,会多次调用一个函数,其返回一个List,List中最多有1万个对象,该函数大概调用9次,但是多次调用后却占用了几个G的内存。

List中存的对象

TopResult是List中保存的对象,每个对象的大小是32字节,chefs和equipid指向的数组是复用的,占用内存不做考虑,recepeids指向的数组为new int[9],占用56字节,也就是一个TopResult对象占用88字节,1w个对象,也不过才859.375KB。

而整个函数中只有一个LinkedList,一个common-pool对象池(用来管理TopResult对象),然后剩下的都是一些int[],首先打印整个运行过程中 TopResult的创建次数, 9w多次,也不过几十M的大小而。

首先通过jvisualvm查看内存使用情况,发现有大量的Objec[]对象,这几个G的内存也都是被这些Objec[]占用了。

当时也怀疑是不是使用common-pool造成的,取消使用对象池后,内存情况并没有得到改善。

最后发现是因为是对LinikList调用了sort的锅。

Collections.sort(List<T> list, Comparator<?super T> c),而我传递的 list是一个LinkedList,然后LinkedList的sort方法继承自List接口中的sort方法,

List接口中的sort方法 LinkedList的toArray()

第一行this.toArray(),这个方法会创建一个Object[]数组。因为sort被调用次数太多,导致Object[]占用了几个G的内存。

我特意统计了下, sort方法被调用了 78684次,每一次调用创建一个Object[10000], 也就是 (4*10000+12)*78684=31474544208字节,2.9G的大小。 最后将LinikList改成ArrayList解决问题。

sort方法调用次数

至于为啥一开始使用LinkedList,因为有时候调用函数后,返回的List会为空,就想着LinkedList占用内存会少一点。

相关文章

  • 记一次LinkedList引起的内存爆炸

    有一个程序,有一段逻辑中,会多次调用一个函数,其返回一个List,List中最多有1万个对象,该函数大概调用9次,...

  • 面试知识点梳理

    Java相关 容器(HashMap、HashSet、LinkedList、ArrayList、数组等) 内存模型 ...

  • 转载:探寻 Redis 内存诡异增长的元凶

    转载:探寻 Redis 内存诡异增长的元凶 记一次 Redis 内存诡异增长,由于 一次RedisRehash 造...

  • List,Map,SET,transient关键字,final,

    List,Map,Set Collection接口 List接口 LinkedList类链表实现,链表内存是散乱的...

  • ArrayList和LinkedList区别

    ArrayList和LinkedList区别 ArrayList:基于动态数据,连续内存存储,适合下标访问(随机访...

  • Mysql_Innodb架构之内存

    InnoDB架构 整体架构图 内存结构 缓冲池 缓冲池:主内存中一块区域,LinkedList结构,元素为page...

  • android 内存性能

    handle引起的内存泄漏 强引用资源引起的内存泄漏 线程导致的内存泄漏 系统学习安卓内存泄露 large hea...

  • 这个东西居然还会引爆,要长记性了!

    对于部分人来说, 面粉爆炸可能也是第一次听说。 大家一定要引起注意了, 当面粉与明火和煤气相遇时, 爆炸的威力不会...

  • 记一次=引起的血案

    如果从时间上看, 是用了两个小时的时间在这个问题上面. 那么最后是什么原因呢 有错误的python代码 正确的py...

  • 我们的众神53

    第一声爆炸来自于七楼的5D演示厅,那辆破窗而入的汽车油箱漏油电路短路引起车辆自燃而发生爆炸,因此第一次爆炸声响比较...

网友评论

      本文标题:记一次LinkedList引起的内存爆炸

      本文链接:https://www.haomeiwen.com/subject/qblauktx.html