【问题标题】:How do I prevent Java's OutOfMemoryError from occurring on file load?如何防止 Java 的 OutOfMemoryError 在文件加载时发生?
【发布时间】:2013-10-03 00:52:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不过。基于RAM,您可以对文件进行分区并将其分块加载到内存中并填充model 类。
  • 试试看这个问题:[Using java to get os level system information][1] [1]:stackoverflow.com/questions/25552/…
  • @Prateek 尽管我很喜欢这个想法,但我不认为是文件使堆过载。我认为Model 变得太大了——所以拆分它不会有太大的不同。

标签: java error-handling runtime-error heap-memory


【解决方案1】:
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());

【讨论】:

  • 谢谢,freeMemory() 命令正是我要找的,你用它打败了 lreeder。时间到了我会接受的。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,但是我怎么知道它是否太大?对于一个用户的计算机来说可能太大的东西对于另一个用户的计算机来说是不同的。
  • 确定并设置一个上限,您知道旧机器仍将支持该上限,因此您永远不会耗尽内存。较新的机器永远不会使用所有内存,但较旧的机器仍然可以使用您的网站。
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
相关资源
最近更新 更多