【发布时间】:2012-09-12 03:39:41
【问题描述】:
我正在开发一个加载大量数据(例如来自 csv)的应用程序。
我正在创建List<List<SimpleCell>> 并将读取的单元格加载到其中。
SimpleCell 类包含 5 * String,每个 String 平均有 10 个字符。
所以我在想,如果我读取 1000 行——每行包含 160 列——给出 1000*160=160 000 SimpleCell 的实例——大约是 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 创建) - 所以只有局部变量(我认为在不久的'未来'会被丢弃)。
我在读取 1000 行时收到 out of heap error,但我必须读取大约 7k。
显然 - 关于 jvm 内存,我不知道一些事情。 那么为什么在加载这么少的数据时内存使用量如此之大呢?
【问题讨论】:
-
如果你创建一个 System.out.println ("Values size " + values.size() ),你是否有相当数量的 SimpleCells 实例?
-
有什么原因你不能增量处理你的文件?
-
@HernanVelasquez
values.size()总是返回160- 在SAXHandler中有一个常数表示它。 @Wug 我正在逐步处理它 -saxRead从中读取一个文件和一行。 -
可以发一下saxRead方法吗?
-
@Xeon:所以...不要将它添加到列表中,处理它并删除它?
标签: java memory jvm heap-memory