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是空闲内存的良好指示。
添加回答
举报