Java获取可用内存
有什么好的方法可以在运行时将剩余的内存提供给JVM?这种情况的用例是使Web服务在接近内存限制时通过拒绝一个新的错误消息“太多的人使用此,请稍后再试”,而不是因OutOfMemory错误而突然死亡而接近失败,从而正常失败。
注意,这与事先计算/估算每个对象的成本无关。原则上,我可以根据该估算值估算对象占用并拒绝新连接的内存量,但这似乎有点hacky /脆弱。
回答:
这是该主题给出的答案的内联成绩单。但是,尽管我的回答被标记为已接受,但在该主题上已指出,这不是理想的解决方案。
public class Main { public static void main(String[] args) {
/* Total number of processors or cores available to the JVM */
System.out.println("Available processors (cores): " +
Runtime.getRuntime().availableProcessors());
/* 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());
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
/* For each filesystem root, print some info */
for (File root : roots) {
System.out.println("File system root: " + root.getAbsolutePath());
System.out.println("Total space (bytes): " + root.getTotalSpace());
System.out.println("Free space (bytes): " + root.getFreeSpace());
System.out.println("Usable space (bytes): " + root.getUsableSpace());
}
}
}
用户克里斯蒂安·弗里斯(Christian Fries)指出,假设Runtime.getRuntime().freeMemory()
为你提供了在出现内存不足错误之前可以分配的内存量是错误的。
在文档中,的签名返回Runtime.getRuntime().freeMemory()
是这样的:
返回:近似于当前可供将来分配的对象使用的内存总量,以字节为单位。
但是,用户Christian Fries声称此功能可能会被误解。他声称,直到出现内存不足错误(空闲内存)之前可以分配的大约内存量可能由以下公式给出:
long presumableFreeMemory = Runtime.getRuntime().maxMemory() - allocatedMemory;
由allocatedMemory给出:
long allocatedMemory = (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory());
这里的关键是空闲内存的概念之间的差异。一件事是操作系统提供的Java虚拟机内存。另一个是Java虚拟机本身实际使用的包括内存块块的字节总数。
考虑到分配给Java应用程序的内存是由Java虚拟机按块管理的,因此Java虚拟机可用的可用内存量可能与Java应用程序可用的内存不完全匹配。
具体来说,克里斯汀·弗里斯(Christian Fries)表示-mx或-Xmx标志的使用,以设置Java虚拟机可用的最大内存量。他指出以下功能差异:
/* Returns the maximum amount of memory available to the Java Virtual Machine set by the '-mx' or '-Xmx' flags. */
Runtime.getRuntime().maxMemory();
/* Returns the total memory allocated from the system
(which can at most reach the maximum memory value
returned by the previous function). */
Runtime.getRuntime().totalMemory();
/* Returns the free memory *within* the total memory
returned by the previous function. */
Runtime.getRuntime().freeMemory();
克里斯蒂安总结自己的答案时指出,Runtime.getRuntime().freeMemory()
实际上返回的是所谓的“可能的自由记忆”。即使将来的内存分配不超过该函数返回的值,如果Java虚拟机尚未收到主机系统分配的实际内存块,java.lang.OutOfMemoryError仍可能会产生a。
最后,正确的使用方法将在不同程度上取决于你的应用程序的具体情况。
以上是 Java获取可用内存 的全部内容, 来源链接: utcz.com/qa/404614.html