我正在开发一个加载文件并使用它们的信息来填充Model
类的程序。这些文件的大小可以从几 KB 到几乎 1 GB。当它们的大小波动时,类使用的内存也会波动Model
。
当我加载一个足够大的文件时,我会收到OutOfMemoryError
.
我能够拒绝用户加载文件的请求(基于文件大小)。如何检查文件、确定其大小,然后确定应用程序是否可以处理它?
有没有办法让它适应用户计算机上的 RAM 量?
我正在开发一个加载文件并使用它们的信息来填充Model
类的程序。这些文件的大小可以从几 KB 到几乎 1 GB。当它们的大小波动时,类使用的内存也会波动Model
。
当我加载一个足够大的文件时,我会收到OutOfMemoryError
.
我能够拒绝用户加载文件的请求(基于文件大小)。如何检查文件、确定其大小,然后确定应用程序是否可以处理它?
有没有办法让它适应用户计算机上的 RAM 量?
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());
使用File.length()确定文件的大小,如果太大则拒绝。
你怎么知道它是否太大?使用Runtime.freeMemory()查看您还剩下多少堆。当然,加载文件并将其填充到您的Model
类中会占用额外的内存,并且您实际上可能不会保留文件的全部内容。根据您对如何使用数据的了解,您应该留出足够的空间来加载类中的所有数据。
请注意,JVM 通常不会分配用户计算机中的所有内存,但可能默认为一些较小的数字。如果用户对默认设置不满意,可以使用 Xmx 选项对其进行修改。