![]() |
2
2
为了更新我自己的问题,我发现最好的解决方案是设置最小堆大小(我将其设置为10M)。这意味着JVM不必决定是否扩展堆,因此它(到目前为止在测试中)永远不会在内存不足的情况下死亡,即使它应该有足够的空间。到目前为止,在测试中,我们已经能够在不出错的情况下将解析的数据量增加三倍,如果我们真的需要的话,我们还可以做得更好。 这是一个让现有客户满意的快速解决方案的一个小技巧,但是我们现在正在寻找一个不同的JVM,如果该JVM能更好地处理这个scneario,我将用一个更新报告回来。 |
![]() |
3
1
根据我对JVM的了解,碎片化永远不会成为问题 有 解决。如果没有更多的分配空间(无论是否由于碎片),垃圾收集器应该运行,并且GCS通常也会压缩数据以解决碎片问题。 强调——你只会出现“记忆不足”的错误。 之后 GC已运行,但仍无法释放足够的内存。 相反,我会尝试为您正在运行的特定JVM挖掘更多的选项。例如,“复制”垃圾收集器一次只使用可用内存的一半,因此将VM更改为使用其他内容可能会释放一半的内存。 我并不是真的建议您的虚拟机使用简单的复制GC,我只是建议在虚拟机级别上进行探测。 |
![]() |
4
0
我认为你有足够的内存,但是正在创建大量的引用对象。试试这篇文章: https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-1049545.html?tag=rbxccnbtr1 更多信息。 |
![]() |
5
0
我不确定这些StringBuffers是否在minml中被分配——如果是这样,我假设您拥有它的源代码?如果这样做,那么在扫描字符串时,如果字符串达到某个长度(比如10000个字节),您可以提前确定字符串的确切长度,并重新分配缓冲区到该大小。这很难看,但可以节省记忆。(它甚至可能比不做lookaheads更快,因为你可能会节省 许多重新分配。) 如果你 不要 有权访问minml源代码,那么我不确定StringBuffer的生存期与XML文档的关系是什么。但是这个建议(尽管比上一个更糟糕)可能仍然有效:既然您是从磁盘获取XML,也许您可以使用(比如)SAX解析器对其进行预解析,仅仅是为了获得字符串字段的大小,并相应地分配StingBuffers? |
![]() |
6
0
您能从设备中获得堆转储吗? 如果获得堆转储,并且它是兼容格式的,一些Java内存分析器会给出关于相邻内存块大小的信息。我记得在IBM堆分析器中看到了这个功能 http://www.alphaworks.ibm.com/tech/heapanalyzer ,但也要检查最新的Eclipse内存分析器 http://www.eclipse.org/mat/ 如果您有可能修改XML文件,那么这可能是最快的方法。Java中的XML解析始终是内存密集型的,对于单个字段来说,300 K是相当多的。相反,您可以尝试将此字段分隔为单独的非XML文件。 |