java - ArrayList 内存不足错误

标签 java performance

我尝试从 SQL 数据库检索 100,000 条记录,但在使用 ArrayList 时出现内存不足错误。

如何优化我的代码来实现这一目标?如何将享元设计模式应用到我的代码中?

import java.math.BigDecimal;
import java.util.*;

public class Foo {
    public List<Vo> Service(Vo vo) throws Exception {
        HashMap<Integer, Object> param = null;
        ArrayList<HashMap<String, Object>> getRows = null;
        HashMap<String, Object> row = null;
        Vo Vo = null;

        try {
            List<Vo> list = new ArrayList<Vo>();

            if (Vo != null) {
                param = new HashMap();

                if (Vo.getCode() != null) {
                    param.put(1, Vo.getCode());
                    param.put(2, Vo.getCode());
                }
                if (Vo.getCode() != null) {
                    param.put(3, Vo.getCode());
                    param.put(4, Vo.getCode());
                }

                getRows = (ArrayList) ImpDAO.RetrieveQuery(param);

                if ((getRows != null) && (getRows.size() > 0)) {
                    for (Iterator iterator = getRows.iterator(); iterator.hasNext();) {
                        Vo = new Vo();
                        row = (HashMap) iterator.next();

                        if (row.get("CODE") != null)
                            Vo.setDept((BigDecimal) (row.get("CODE")));
                        if (row.get("SER") != null)
                            Vo.setServCode(row.get("SER").toString());
                        if (row.get("NAME") != null)
                            list.add(Vo);
                    }
                }
            }
        } catch (Exception ae) {
            throw ae;
        }

        return list;
    }
}

最佳答案

双数据结构

我看到的最大问题是(ArrayList)ImpDAO.RetrieveQuery(param):RetrieveQuery 已经返回 HashMap 列表。因此,您的数据结构在内存中存在两次,尽管它们可能指向相同的对象。

考虑更改 RetrieveQuery 以返回由基础结果集支持的迭代器(甚至更好是流)。这将使您不必在内存中保留两个具有相同内容的大型数据结构。

对象类型

row.get("SER") 的类型是什么?如果答案不是字符串,您可能会为每一行创建一个新字符串。这将大大增加您的内存占用量。

row.get("CODE") 怎么样?这是否需要是 BigDecimal? int 也能工作吗?如果是这样,您可以通过切换在每行上节省一些字节。

100k 是很多行

几乎没有理由同时获取 100k 行。这是要到ui来显示吗?如果是这样,你真的会一次显示 100k 行吗?也许你应该看看分页。这是要进行加工作业吗?也许我们可以设置一个限制并分块处理它。

问这种问题会让人想知道 underlying problem 是什么?是。

关于java - ArrayList 内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42073539/

相关文章:

java - Jquery Load 函数不引用母版页脚本文件

java - PHP:如何从同一 MYSQL 数据库的不同表中用 PHP 编写变量

java - jhipster 不工作 POST REST API

java - 计算总和时结果错误

c - 使用 C/Intel 汇编,测试 128 字节内存块是否包含全零的最快方法是什么?

Java返回一个空列表

javascript - 是什么导致相同数量的循环具有不同的性能?

mysql - 如何改进具有多个 JOINS 的 MYSQL 查询

c - 关于光线追踪算法相交测试性能的问题

c++ - Linux 与 Windows,C++ 运行时读取 CSV 文件的性能差异