我有一个由22个字段组成的简单POJO,可以从几个CSV文件中读取。 读者线程逐行读取文件,每行包含这22个字段的值并构造POJO。每个对象都存储在ConcurrentLinkedQueue中。
捕获的总线数约为300万。我在Eclipse中运行我的程序,在双CPU机器中,每个机器都有8个内核。我使用-Xms1024m -Xmx1024m VM参数。
问题是,在读取近800000行后,为每行构建POJO并将POJO提供给队列时,我得到堆空间的OutOfMemory错误。
我的问题是这些很多对象是否可以存储在队列中而不会出现OutOfMemory问题?
答案 0 :(得分:0)
嗯,你只是在消耗所有可用的内存。在抛出OutOfMemoryError之前,JVM会尝试进行任务,因此除了增加堆大小之外你不能做任何事情 - > -Xmx2g(例如)
答案 1 :(得分:0)
如果您对填充堆的确切感到好奇,请尝试使用 -XX:+ HeapDumpOnOutOfMemoryError 参数启动jvm。发生内存不足错误时将创建堆转储,您可以使用jvisualvm或Eclipse Memory Analyzer
打开它