Java获取可用内存

有什么好的方法可以在运行时将剩余的内存提供给JVM?这种情况的用例是使Web服务在接近内存限制时通过拒绝一个新的错误消息“太多的人使用此,请稍后再试”,而不是由于OutOfMemory错误而突然死亡,从而在它们接近内存限制时优雅地失败。 。

注意,这与事先计算/估算每个对象的成本无关。原则上,我可以根据该估算值估算对象占用并拒绝新连接的内存量,但这似乎有点hacky /脆弱。


紫衣仙女
浏览 1233回答 3
3回答

侃侃尔雅

注意:到目前为止,所有答案,甚至是已接受的答案,似乎都在回答这个问题,说这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是空闲内存的良好指示。
打开App,查看更多内容
随时随地看视频慕课网APP