`
zenghuiss
  • 浏览: 26026 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个list引发的血案

    博客分类:
  • Java
 
阅读更多
其实用血案这个有点标题党的感觉,只为博君眼球,套个快过年时的万用语句,来都来了,就看完吧

我们有个业务系统跑了好几年了,一直很稳定,前端时间系统突然开始报内存溢出,分析定位,发现是这段代码的问题:
List<ModelBean> beaList = null;
for(int i=0; i<loop; i++) {
 beanList = service.getBeanList();
 businessProcess(beanList)
}


恩,很简单的一段逻辑,从数据库里查询到一个list,然后处理业务逻辑。
貌似没有什么问题呀!?
确实,在数据量比较小的时候运行的非常安逸,但是!当数据的量级增长问题就来了!
分析一下:
beanList第一次返回1000w数据,开始处理业务逻辑,处理完成,这个时候内存中的beanList由于内存占用过大,直接产生在老年代,而第二次从数据库返回1000w数据的时候,内存不足,GC开始工作,但是发现原来的第一次使用过的beanList由于for块外的引用还存在,还无法回收内存,开始徒劳的fullGC,结果就out of memory了。

问题分析出来了,解决方法也就很简单了:
for(int i=0; i<loop; i++) {
 List<ModelBean> beanList = service.getBeanList();
 businessProcess(beanList)
}

将beanList的生命周期封闭在for循环内,问题迎刃而解。

有人也许会说,这么基础的问题,值得你写篇文章来说道吗?其实不然,最简单的问题往往是我们最容易忽视的问题,解决问题一般都是容易的,困难是查找和分析问题。开始学习effective java就看到过,把local variable的生命周期尽可能封闭在其使用周期结束内,代码写得时间久了,越来越随心所欲,久而久之就忘记了很多基础的要求,写下来,算是对自己的一个警醒吧。

分享到:
评论

相关推荐

    list to list 将list内容移到另一个list

    `list to list` 操作通常指的是将一个列表(list)的内容移动到另一个列表中,这可能涉及到列表的复制、合并或者元素的迁移。下面我们将深入探讨这个主题,同时也会关注到`listtolist.js`这个文件,它可能是...

    Java将2个List集合合并到一个List里面并排序工具类

    Java将2个List集合合并到一个List里面并排序工具类 1、Java编程资源,定义了一个名为`ListMerger`的工具类,主要包含一个名为`mergeAndSortLists`的静态方法。此方法用于将两个已经根据时间顺序排列的List合并成一...

    java计算同一个list中是否有相同的值

    在给定的代码片段中,作者提供了一个方法来检测一个 `List` 中是否存在重复项,并统计最大重复次数。这种方法虽然实现了目标,但其效率较低,尤其是在处理大数据集时。接下来我们将详细分析该方法的工作原理,并探讨...

    将一个比较大的list分割为多个小的list

    将一个比较大的list分割为多个小的list,可以解决mybatis批量插⼊数据list超过⼀定长度时报错的解决办法

    关于Java中List对象的分页思想-按10个或者n个数对list进行分组

    Java中List对象的分页思想是一种常用的数据处理技术,通过将一个大的List对象分割成多个小的List对象,每个小的List对象包含一定数量的元素,例如10个或n个。这种技术可以用于解决大规模数据的处理问题,例如批量...

    C语言中创建一个list

    c语言 list代码 包括随机创建一个list insert() delete() printlist() fill() count()方程 选取特定的node然后更改数值 printfront(输出从0-1/3的list) printmiddle(1/3-2/3的list) printback(2/3-3/3的list) 输出一...

    两个list比较 取不同的对象

    本文将详细探讨如何通过一个示例代码来理解如何比较两个`List`并提取出不同的对象。 #### 核心知识点解析 1. **列表(List)的基础操作**: - `List`是一种常用的数据结构,在Java中,`List`接口是`Collection`框架...

    list嵌套list例子

    当我们谈论“list嵌套list”时,这意味着在一个列表内部包含了一个或多个列表,这样的结构可以创建出多维的数据集合。这种数据结构在处理表格数据、矩阵或树形结构时特别有用。 下面我们将详细探讨如何创建、操作和...

    List转换为List

    4. **将Map添加到新的List中**:每当创建完一个Map后,将其添加到一个新的List集合中。 5. **返回新的List**:最终返回包含Map对象的List集合。 #### 示例代码: 假设有一个AnnouncementBean类,包含属性:actid...

    java8 stream 由一个list转化成另一个list案例

    Java8 Stream 由一个 List 转化成另一个 List 案例 Java8 Stream 是一个功能强大的工具,可以将一个 List 转化成另一个 List,今天我们就来探讨这个话题。 什么是 Java8 Stream Java8 Stream 是 Java 语言的一个...

    按照规则,对list排序

    * 以 01-02-简介.jpg 为例: 01 代表当前文件所属第几帧,02 代表当前文件在所属帧里面的文件排序为第二个 * @param list 播放的文件 * @param subject 视频短信标题 * @param playTime 每一帧播放的时长 单位秒...

    List集合之间内连接

    假设我们有两个List集合,一个是`List&lt;Person&gt;`,另一个是`List&lt;Address&gt;`,我们想找到Person列表中与Address列表匹配的元素,基于它们的ID字段。 ```csharp using System.Linq; class Person { public int ID { ...

    缓存一个list的内容进txt文件,Android

    本话题主要探讨如何将一个list的内容缓存到TXT文件中,并实现读取操作。 首先,我们需要创建一个list,填充必要的数据。这个数据可以是任何类型,如字符串、整数或其他自定义对象。假设我们有一个String类型的list...

    java List 深度复制方法

    当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来...

    创建一个数据类型为T的链表类模板List,实现以下成员函数的模拟测试.cpp

    1. 请创建一个数据类型为T的链表类模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分)...

    java合并LIST

    2. 使用addAll()方法合并LIST:addAll()方法是Java中的一个集合操作方法,用于将一个集合中的所有元素添加到另一个集合中。 3. 避免LIST中的元素重复:在合并LIST时,需要考虑到LIST中的元素可能存在重复的情况,...

    Scala的List类方法整合

    此方法用于向列表的末尾添加一个元素,并返回一个新的列表。 **示例代码:** ```scala val list = List(1, 2, 3) val newList = list + 4 // 结果为 List(1, 2, 3, 4) ``` #### 2. `def :: (x: A): List[A]` 该方法...

    ListCtrl设置单元格颜色

    在编程领域,尤其是在GUI(图形用户界面)设计中,`ListCtrl` 是一个常见的控件,主要用于展示列表形式的数据。`ListCtrl` 常见于像wxPython、MFC (Microsoft Foundation Classes) 和wxWidgets等库中。本篇文章将...

    C#多线程List的非线程安全性

    4. 使用CopyTo()方法:如果只需要读取List,可以先将List复制到一个新的数组,然后在多线程环境中操作这个数组,避免直接操作List。 5. 使用线程池:对于大量并发的短任务,使用ThreadPool可以有效减少线程创建和...

    delphi Tlist使用方法举例

    在Delphi编程环境中,`TList` 是一个基础且重要的数据结构,用于存储动态数组。在 Delphi 的 VCL(Visual Component Library)框架中,`TList` 类提供了方便的方法来管理和操作对象列表。本教程将通过一个DEMO示例,...

Global site tag (gtag.js) - Google Analytics