如何防止Java的OutOfMemoryError在文件加载时发生?

时间:2013-09-26 21:04:23

标签: java error-handling heap runtime-error

我正在开发一个加载文件并使用其信息填充Model类的程序。这些文件的大小范围可以从几KB到几乎GB。当它们的大小波动时,Model类使用的内存也是如此。

当我加载足够大的文件时,我会收到OutOfMemoryError

我可以拒绝用户加载文件的请求(基于文件大小)。如何检查文件,确定其大小,然后确定应用程序是否可以处理它?<​​/ p>

有没有办法让它适应用户计算机上的RAM量?

2 个答案:

答案 0 :(得分:2)

使用File.length()确定文件的大小,如果文件太大则拒绝。

你怎么知道它太大了?使用Runtime.freeMemory()查看剩余的堆数。当然,加载文件并将其填充到Model类中会占用额外的内存,实际上您可能无法保留文件的全部内容。您应该留出足够的空间来根据您对如何使用数据的了解加载类中的所有数据。

请注意,JVM通常不会分配给用户计算机中的所有内存,但可能默认为较小的数字。如果用户对默认值不满意,可以使用Xmx选项进行修改。

答案 1 :(得分:2)

You can query the JVM to see how much free and used memory there is :

/* Total amount of free memory available to the JVM */
System.out.println("Free memory (bytes): " + 
Runtime.getRuntime().freeMemory());

/* This will return Long.MAX_VALUE if there is no preset limit */
long maxMemory = Runtime.getRuntime().maxMemory();
 /* Maximum amount of memory the JVM will attempt to use */
System.out.println("Maximum memory (bytes): " + 
(maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));

/* Total memory currently in use by the JVM */
System.out.println("Total memory (bytes): " + 
Runtime.getRuntime().totalMemory());