当前位置: 首页 > 面试题库 >

Java获取可用内存

归翔
2023-03-14
问题内容

有什么好的方法可以在运行时将剩余的内存提供给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的CameraX中获取预览的所有可用尺寸?我已经看到了Kotlin的答案,但无法用Java实现。

  • 问题内容: 我正在尝试对一堆数据进行排序,以使输入到程序的数据大小可以大于JVM可用的内存,并且处理所需的外部排序要比Quicksort慢得多。 有什么方法可以在运行时获取可供JVM使用的内存,以便我可以在尽可能多的地方使用排序,并且仅在数据输入太大时才切换到Mergesort吗? 问题答案: 在类中查看以下方法: 例 还要注意,如果总内存已用完,则始终可以使用JVM参数分配更多的堆来启动JVM。

  • 本文向大家介绍Android 如何获取手机总内存和可用内存等信息,包括了Android 如何获取手机总内存和可用内存等信息的使用技巧和注意事项,需要的朋友参考一下 在android开发中,有时候我们想获取手机的一些硬件信息,比如android手机的总内存和可用内存大小。 这个该如何实现呢? 通过读取文件"/proc/meminfo"的信息能够获取手机Memory的总量,而通过ActivityMan

  • 问题内容: 用Java获取IP地址的最佳方法是什么?我正在尝试,但是它返回了我的计算机IP地址。我想是这样。我也试图从类似的服务中通过HTML获取IP,但是我认为这不是一个好主意。 问题答案: 以下内容使用Amazon Web服务并为我工作。

  • 还有一种调用模板的情况是我们只想渲染后返回模板渲染后的数据而不是直接输出,这时我们会用fetch方法; fetch的用法和display 完全一样,只是不直接输出了; //不带任何参数 $content=$this->fetch(); 此种方式系统会自动判断模板路径,并渲染出模板内容,此种方式模板路径是:主题名/应用名/控制器名/操作名+模板文件后缀名; $content=$this->fetc

  • 问题内容: 我正在用SAX解析XML文件,有时需要元素的内部XML。例如,对于以下XML 我需要获取元素 a 的内部XML ,这将是 最简单的方法是什么? 谢谢。 伊万 问题答案: 对于这种情况,我建议使用2个内容处理程序。第一个负责查找文档的相关部分,第二个负责处理内容。我对类似问题的答案(请参见下面的链接)演示了如何实现此方法: 使用SAX解析常见的XML元素