我正在开发一个加载大量数据的应用程序(比如来自 csv)。
我正在创建List<List<SimpleCell>>
并将读取的单元格加载到其中。SimpleCell 类包含 5 个 * String
,每个String
平均有 10 个字符。
所以我在想,如果我读取 1000 行 - 每行包含 160 列 - 给出 1000*160=160 000SimpleCell
的实例 - 这将是大约 160 000 * sizeof(SimpleCell.class)
=~ 160 000 * 10 * 5 = 8 000 000字节 =~ 7.63 MB。
但是当我查看 jconsole 时(并单击后Perform GC
),内存使用量约为 790MB。这怎么可能?
请注意,我不存储对任何“临时”对象的任何引用。这是内存使用量上升时的代码:
for(int i = r.getFromIndex(); i <= r.getToIndex(); ++i) {
System.out.println("Processing: 'ZZ " + i + "'");
List<SimpleCell> values = saxRead("ZT/ZZ " + i + "");
rows.add(values);
}
saxRead
只是创建 inputStream 用 SAX 解析它,关闭流,然后返回单元格(由 SAXHandler 创建) - 所以只有局部变量(我认为在不久的'将来'会被丢弃)。
我out of heap error
在阅读 1000 行时得到,但我必须阅读大约 7k。
显然 - 关于 jvm 内存,我不知道一些事情。那么为什么在加载这么少量的数据时内存使用量如此之大呢?