为了账号安全,请及时绑定邮箱和手机立即绑定

Java获取可用内存

Java获取可用内存

紫衣仙女 2019-11-12 14:55:42
有什么好的方法可以在运行时将剩余的内存提供给JVM?这种情况的用例是使Web服务在接近内存限制时通过拒绝一个新的错误消息“太多的人使用此,请稍后再试”,而不是由于OutOfMemory错误而突然死亡,从而在它们接近内存限制时优雅地失败。 。注意,这与事先计算/估算每个对象的成本无关。原则上,我可以根据该估算值估算对象占用并拒绝新连接的内存量,但这似乎有点hacky /脆弱。
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

注意:到目前为止,所有答案,甚至是已接受的答案,似乎都在回答这个问题,说这Runtime.getRuntime().freeMemory()将为您提供可能分配的内存量,直到发生内存不足错误为止。但是:这是错误的。


直到出现内存不足错误(即可能有空闲内存)之前可以分配的大概内存量


long presumableFreeMemory = Runtime.getRuntime().maxMemory() - allocatedMemory;

哪里


long allocatedMemory      = (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory());

说明: 如果通过-mx参数(或-Xmx)启动JVM,则指定可用于JVM的最大数量。Runtime.getRuntime().maxMemory()会给你这笔钱。JVM将从此系统内存量中分块分配内存,例如64 mb的块。在开始时,JVM只会从系统中分配这样的块,而不是全部。Runtime.getRuntime().totalMemory()给出了系统分配的总内存,同时Runtime.getRuntime().freeMemory()为您提供免费的内存中分配的内存总量。


因此:


long definitelyFreeMemory = Runtime.getRuntime().freeMemory();

是JVM已经保留的可用内存,但是可能只有少量。而且您可能会得到presumableFreeMemory。当然,即使您尝试分配的大小小于,也可能会遇到内存不足的异常presumableFreeMemory。如果JVM无法从系统中获取下一个内存块,则可能会发生这种情况。但是,在大多数系统上,这种情况永远不会发生,并且系统宁愿开始交换-您希望避免这种情况。原始问题的答案:如果-mx设置为合理的值,那么它presumableFreeMemory是空闲内存的良好指示。


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 1277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信