java 可用内存_Java获取可用内存

本文探讨了如何在Java中使用Runtime类获取可用内存和最大内存,以及理解这些值与实际内存使用的关系。Java程序员应注意Runtime.getRuntime().freeMemory()返回的并不是绝对的可用内存,而是近似值,可能会导致内存不足错误。正确评估内存使用需要考虑Java虚拟机的内存管理机制。
摘要由CSDN通过智能技术生成

f731dd41c521bb2157177fbacbbf6c6e.png

阿波罗的战车

我最初提供了此示例(链接到威廉·布伦德尔对另一个主题的答案)。该主题的创建者(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堆大小的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值