在分配字节数组之前检查是否有足够的内存

mat*_*ias 4 java

我需要将文件加载到内存中.在我这样做之前,我想确保我的VM中有足够的内存.如果不是,我想显示错误消息.我想避免这个OutOfMemory例外.

做法:

  1. 获取我的文件的文件大小
  2. 使用 Runtime.getRuntime().freeMemory()
  3. 检查它是否合适

这会有用还是你有其他建议吗?

pax*_*blo 5

任何"先检查再做"策略的问题是"检查"和"执行"之间可能会有变化,导致整个事情无用.

"尝试然后恢复"策略几乎总是一个更好的主意,不幸的是,这意味着尝试分配内存并处理异常.即使您执行 "先检查"选项,您仍应编码分配可能失败的可能性.

一个典型的例子就是在打开文件之前检查文件是否存在.如果有人要在你的检查和打开之间删除文件,你将得到一个例外,无论文件最近在那里.

现在我不知道为什么你厌恶捕捉异常,但我敦促你重新思考它.由于Java在很大程度上依赖于它们,如果你实际上并没有控制你正在尝试的东西(比如打开文件或分配内存),那么它们通常被认为是一种很好的做事方式.


如果从你的评论中看出你担心影响其他线程的内存不足,那么如果你试图为文件分配一个大区域,情况就不应该如此.如果你剩下400M并且你要求600,你的请求将会失败,但你仍然应该剩下400M.

只有当你的方式达到极限(比如尝试600次单独的1M分配)时,其他线程才会在你完成大约400次之后开始感受到压力.只有当你不发布时才会发生这种情况那些400人匆忙.

所以也许有可能找出你需要多少空间,并确保你在一次点击中分配它.它既可以工作,也可以不工作.如果没有,你的其他线程将不会更糟.

我想你可以使用你建议的方法来尝试确保分配给其他线程留下一些空间(例如100M或10%或类似的东西),如果你真的担心的话.但我还是继续尝试.如果你的其他线程由于内存不足而无法完成工作,那么就有足够的先例告诉用户为VM提供更多内存.