我们开发了一个java应用程序,其主要目标是读取文件(输入文件),处理它并将其转换为一组输出文件。如何在Java中的内存密集型应用程序中避免OutOfMemory异常?
(我已经给出了我们解决方案的一般描述,以避免不相关的细节)。
这个程序工作完全正常,当输入文件为4 GB,具有-Xms4096m -Xmx16384m的内存设置在一个32 GB的RAM
现在,我们需要运行我们的大小130 GB的输入文件的应用程序。
我们使用了一个250GB内存的linux系统,内存设置为-Xms40g -Xmx200g(也尝试了其他一些变体)来运行应用程序并打出OutOfMemory异常。
在这个阶段,我们的项目是很难考虑重新设计的代码,以适应Hadoop的(或一些其它的大规模数据处理框架),也是当前的硬件配置,我们可以买得起是RAM 250GB。
您能否建议我们避免OutOfMemory异常的方法,开发这些类型的应用程序时的一般做法是什么?
在此先感谢
一旦它被读入,你如何将这个文件存储在内存中? – Dodd10x
如果其他答案不适用于您,其中一个选择是使用较少内存密集型数据结构。我不得不推出自己的哈希表,它使用内置的内存的1/5来管理数据,以保持JRE堆在500mb以下。 – Dodd10x
正在读取的文件被添加到其正确的自定义数据结构并存储在内存中。我在整个转换过程中使用哈希表。 – user3203947