如何防止Java';文件加载时发生OutOfMemory错误?

如何防止Java';文件加载时发生OutOfMemory错误?,java,error-handling,heap,runtime-error,Java,Error Handling,Heap,Runtime Error,我正在开发一个程序,该程序加载文件并使用它们的信息填充模型类。这些文件的大小可以从几KB到近1 GB不等。当它们的大小波动时,Model类使用的内存也会波动 当我加载一个足够大的文件时,我会收到OutOfMemoryError 我能够拒绝用户加载文件的请求(基于文件大小)。如何检查文件,确定其大小,然后确定应用程序是否可以处理它 是否有办法使其适应用户计算机上的RAM量?用于确定文件大小,如果文件太大,则拒绝 你怎么知道它是不是太大了?用于查看您还剩下多少堆。当然,加载文件并将其填充到Model

我正在开发一个程序,该程序加载文件并使用它们的信息填充
模型
类。这些文件的大小可以从几KB到近1 GB不等。当它们的大小波动时,
Model
类使用的内存也会波动

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

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

是否有办法使其适应用户计算机上的RAM量?

用于确定文件大小,如果文件太大,则拒绝

你怎么知道它是不是太大了?用于查看您还剩下多少堆。当然,加载文件并将其填充到
Model
类中会占用额外的内存,并且您可能不会保留文件的全部内容。根据您对如何使用数据的了解,应该留出足够的空间来加载类中的所有数据

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

用于确定文件大小,如果文件太大,则拒绝

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());
你怎么知道它是不是太大了?用于查看您还剩下多少堆。当然,加载文件并将其填充到
Model
类中会占用额外的内存,并且您可能不会保留文件的全部内容。根据您对如何使用数据的了解,应该留出足够的空间来加载类中的所有数据


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

是的,但我如何知道它是否太大?对于一个用户的计算机来说,可能太大的内容对于另一个用户的计算机来说是不同的。确定并设置一个上限,您知道旧计算机仍然支持该上限,这样您就永远不会耗尽内存。较新的机器永远不会使用所有内存,但较旧的机器仍然可以使用您的站点。是的,但是我如何知道它是否太大?对于一个用户的计算机来说,可能太大的内容对于另一个用户的计算机来说是不同的。确定并设置一个上限,您知道旧计算机仍然支持该上限,这样您就永远不会耗尽内存。较新的机器永远不会使用所有的内存,但较旧的机器仍然可以使用您的站点。尽管如此。基于
RAM
您可以将文件分区并分块加载到内存中,然后填充
model
类。试着看看这个问题:[使用java获取操作系统级系统信息][1][1]:@pratek尽管我很喜欢这个想法,但我不认为是文件导致堆过载。我认为
模型
太大了,所以把它分开不会有太大的区别。尽管如此。基于
RAM
您可以将文件分区并分块加载到内存中,然后填充
model
类。试着看看这个问题:[使用java获取操作系统级系统信息][1][1]:@pratek尽管我很喜欢这个想法,但我不认为是文件导致堆过载。我认为
模型
太大了,所以将其拆分不会产生太大的影响。谢谢,
freemory()
命令就是我要找的,你用它击败了lreeder。时间到了我会接受的。谢谢,
freemory()
命令就是我要找的,你用它击败了lreeder。时间到了我就接受。
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());