【问题标题】:What is the memory footprint of the JVM and how can I minimize it?JVM 的内存占用量是多少,如何将其最小化?
【发布时间】:2016-07-24 12:52:58
【问题描述】:

我只是想知道当 JavaVM(Sun、Linux)开始产生多个 JVM 进程时实际占用的空间是多少。当我记得很清楚时,那些应该分享 rt.jar (也许更远?)。这些 JVM 是否共享 JIT 缓存(所有 JVM 具有相同的 Classpath)?

有什么办法可以减少多实例 JVM 的开销吗? (除了为堆设置更小的限制)?

在编写应用程序时我可以做些什么?

我可以共享内存区域吗?也许共享映射的内存块?

【问题讨论】:

  • 为什么需要生成多个 JVM?有人愿意这样做是有原因的,但你的原因是什么?
  • 如果您使用多个 JVM,这是有充分理由的,与您运行的机器相比,每个 JVM 的内存开销应该非常小。
  • 简单地说,在开发过程中,我将在一个进程中拥有任何东西。在部署过程中,我想知道是否可以将许多不同的部分放在不同的过程中以帮助提高稳定性而不是简单性。给你举个例子。如果您在 Linux 上调出最近的 Chrome 版本 + Selenium,则进程卡住并锁定的几率约为 25:1。通过将它放在自己的进程中,如果需要太长时间,就杀死他的 chrome 进程,这就是答案。另一种情况是运行 C++ 代码,将其隔离在自己的进程中不会使您的 JVM 因故障而崩溃,如果发生故障,您可以重新启动它。
  • 有许多不同的 JVM。有些比其他的占用空间更小,通常以牺牲性能为代价。
  • 今天基本上我认识的每个人都在使用 Sun VM。据我所知,其他虚拟机几乎没有用于生产。一些在开发过程中使用增强虚拟机(动态替换类并使对象图适应变化)。

标签: java memory jvm memory-footprint


【解决方案1】:

This post 描述了构成 Java 应用程序足迹的内容。也就是说,如果你想减少占用空间,你需要减少这些部分:Java Heap、Metaspace、Code Cache、直接缓冲区、线程数等。

HotSpot JVM 的实例不会相互通信以共享数据。基本上,除了操作系统共享的东西,即动态库 (.so) 和只读内存映射文件 (.jars) 之外,它们不共享任何内容。

由应用程序通过 IPC 机制提供进一步的共享,例如内存映射文件。

【讨论】:

  • 我查了一下,它被称为类数据共享:docs.oracle.com/javase/7/docs/technotes/guides/vm/… 它声明它加载数据处理类,而不是共享它以更快地加载。最终这并不是我最初所希望的。但它不同于文件访问操作系统缓存。
  • @MartinKersten 对。 CDS 是一种将预加载的类映射到 JVM 进程的地址空间的机制。 CDS 映像作为内存映射文件在 JVM 之间共享。虽然我会说这更多的是减少启动时间而不是减少占用空间。
【解决方案2】:

可能只是部分答案。

JVM的内存占用是多少

Java 应用程序的完整占用空间包括堆空间和非堆空间(我这样称呼它)。仅举几个非堆空间中的示例:PermGen 或 Metaspace,从代码中直接分配 (malloc),NIO 也使用本机内存。

我怎样才能最小化它?

堆通常占据你足迹的最大部分。所以,我会从它开始。

至于非堆空间,您可以最小化:PermGen(如果您的最大大小是多余的)、线程堆栈(它们非常大,尤其是在 64 位 JMM 中)和代码缓存(当然是性能方面的) )。

这些 JVM 是否共享 JIT 缓存

在正常情况下(我不知道其他情况)每个进程都有自己的足迹。这实际上是进程与线程的不同之处。再回到多个JVM,每个JVM都是一个独立的进程。

应该分享 rt.jar

如果你从同一个目录(同一个安装)启动 Java,当然,它们共享同一个 rt.jar,但只是作为类的源。例如,String 类的加载次数与正在运行的 JVM 的数量一样多。

【讨论】:

    【解决方案3】:

    为了补充其他答案,这里有几篇有见地的文章列出了典型的 JVM 内存占用值以及测量它们的方法:

    https://spring.io/blog/2015/12/10/spring-boot-memory-performance

    http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多