Java VS RAM:没有'OutOfMemory',Java可以处理多少数据?

时间:2014-02-19 19:18:28

标签: java servlets memory memory-management out-of-memory

我们都被OutOfMemory的错误打败了。如果我们存储的字符超过String限制,如果我们超出StringBuffer限制,如果我们超出ArrayList限制等,则会发生这种情况。有一个很大的清单。但值得注意的是,世界上最大的大数据项目都是用Java构建的,包括亚马逊。所以我有一个问题。 Java可以在内存中存储70 MB的文件吗?此文件包含文本,此文件的每一行都将保存为LinkedList中的元素。因此,如果文件有200,000行,LinkedList将有200,000个元素。想象一下,我有一个4-5 GB的RAM。

Java可以处理这样的事情而不抛出OutOfMemory吗?我不想手动调整堆大小。

你有什么建议?

更新

不要瞄准70MB。想象一下,这个填充量为300GB。我有一个500 GB的RAM(是的,我在一个大数据项目,RAM比这还要大)。现在怎么样?

4 个答案:

答案 0 :(得分:2)

通过在程序启动时添加以下参数,可以更改Java虚拟机(JVM)在运行程序时的内存量。

  • -Xms<initialSize>
  • -Xmx<maxSize>

initialSizemaxSize替换为符合您要求(和限制)的内容。

示例

以下将运行HelloWorld.class,初始堆大小为64 MB,最大堆大小为256 MB。

  

java -Xms64m -Xmx256m HelloWorld

答案 1 :(得分:1)

答案是什么? “这取决于”,因为代际记忆模型。

OutOfMemoryError通常发生在你消耗烫发时,而不是整体记忆。

您的操作系统也有效果。 32位JVM现在允许大于1.2-1.5GB的堆,因为操作系统和JVM占用它们的份额。

64位操作系统和JVM将为您提供更多的堆RAM。

StringBuffer和List的唯一限制是索引和大小的整数(Integer.MAX)。

答案 2 :(得分:0)

是的,Java可以轻松地在内存中存储70MB的文件

答案 3 :(得分:0)

从文件处理大量数据时,缓冲始终是一个合理的答案:您几乎不需要在内存中加载完整的1-10-100 GB文件,但只需要加载小块。如果你这样做,你应该重新考虑你的设计。

此外,只有当您可以使用便利硬件(便宜的低端服务器)时,扩展“大数据”系统才具有成本效益,其中可用资源,内存等受限(每台机器认为低于16 GB,甚至更低) ,一些早期的测试使用只有2 GB RAM的机器,如Google的MapReduce原始论文所述。

遵循上述想法,大多数基于Java(而非)的大数据技术很可能永远不需要在内存中加载大量数据。例如,Hadoop处理单个数据行,一旦完成就将结果转储回磁盘。

因此,除非您的文件中每行的大小为4 GB,否则这不是问题。如果你这样做,你应该重新思考你的设计,数据收集策略,基础设施,或者挑出邪恶的思想,他们认为以这种方式组织你的数据是一个好主意。

最后,为了具体解决您的问题,如果您有一台500 GB RAM的服务器,为什么不运行某些测试?尝试不同的文件大小,不同的文件类型(JSON,XML,普通,CSV)和不同的加载方式(扫描仪,缓冲读取器等)并将数据保存在内存中(地图,字符串列表,类似DOM的对象,等等。)。那么请与我们分享您的发现,因为这听起来很有趣!