阿波罗的战车
我最初提供了此示例(链接到威廉·布伦德尔对另一个主题的答案)。该主题的创建者(Steve M)想要创建一个多平台的Java应用程序。具体地说,用户试图找到一种方法来评估运行中的计算机的资源(磁盘空间,CPU和内存使用情况)。这是该主题给出的答案的内联成绩单。但是,尽管我的回答被标记为已接受,但在该主题上已指出这不是理想的解决方案。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。最后,正确的使用方法将在不同程度上取决于您的应用程序的具体情况。我提供了另一个可能有用的链接。这是由用户Richard Dormand提出的问题,并由stone333回答了有关确定使用的默认Java堆大小的问题。