当前位置: 首页 > 知识库问答 >
问题:

垃圾收集器如何使用Xmx和Xms值

孔经武
2023-03-14
1. Machine memory size = 7.5GB
   Xmx = 1024Mb
   Number of processes = 16
   Xms = 512Mb
2. Machine memory size = 7.5GB
   Xmx = 320MB
   Xms is not defined.
   Number of Processes = 16

其中16*320MB应该小于7.5GB。但在我的例子中,内存使用量再次达到7.5GB。有可能吗?或者我的应用程序中可能有内存泄漏?

所以,基本上我想明白垃圾回收器什么时候运行?它是否在应用程序使用的内存恰好达到Xmx值时运行?或者他们根本没有关系?

共有1个答案

潘琪
2023-03-14

这里有几件事需要理解,然后在你的情况下加以考虑。

每个JVM进程都有自己的虚拟地址空间,操作系统保护它不受其他进程的影响。OS将地址的物理范围(称为页)映射到每个进程的虚拟地址空间。当需要的物理页多于可用页时,一段时间没有使用的页将被写入磁盘(称为分页),然后可以重用。当再次需要这些已保存页的数据时,它们被读回相同或不同的物理页。通过这样做,您可以轻松地在一台物理内存为8GB的机器上运行16个或更多的JVM,所有JVM的堆都为1GB。问题是,所需的磁盘分页越多,应用程序的性能就越差,因为磁盘IO的访问速度比RAM的访问速度慢几个数量级。这也是单个JVM的堆空间不应该大于物理内存的原因。

使用-xms和-xmx选项的原因是您可以指定堆的初始大小和最大大小。当应用程序运行并需要更多的堆空间时,JVM能够在这些范围内增加堆大小。很多时候,这些值被设置为相同,以消除在应用程序运行时必须调整堆大小的开销。大多数操作系统只在需要时才分配物理页面,因此在您的情况下,使-XMS变小不会改变所发生的分页量。

 类似资料:
  • 问题内容: 有人可以解释一下G1垃圾收集器的工作原理吗?我还无法在任何地方找到任何全面,易于理解的描述。 谢谢 问题答案: 收集器将堆分成固定大小的区域,并跟踪这些区域中的实时数据。它将一组指针(“记住的集”)保留在区域内和区域外。当认为有必要使用GC时,它将首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这意味着一步就可以收集整个区域:如果进入一个区域的指针数量为零,则无需对该区域进行标

  • 问题内容: 我们有一个PHP Webapp,它调用Java二进制文件以生成PDF报告(使用JasperReports)。Java二进制文件将PDF输出到标准输出,然后退出。然后,PHP将PDF发送到浏览器。这个Java命令持续大约3到6秒,我认为当它持续6秒时是因为GC启动。我想禁用GC,因为无论如何该命令退出时都会返回所有内存。 我想知道如何针对Java 1.4.2和Java 1.6.0禁用它,

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。 即使在机器学习应用程序等海量数据应用程序的情况下,ZGC 也具有高性能和高效工作。它确保在处理数据时不会因垃圾收集而长时间停顿。它支持 Linux、Window

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。从那时起,对这个垃圾收集做了很多改进,例如 - 并发类卸载 取消提交未使用的内存 支持班级数据共享 NUMA 多线程堆Pre-touch 最大堆大小限制从 4 T

  • 问题内容: 是否有可能使Go中的垃圾收集器处理并释放通过C代码分配的内存?抱歉,我之前没有使用过C和cgo,因此我的示例可能需要澄清。 假设您有一些要使用的C库,并且该库分配了一些需要手动释放的内存。我想做的是这样的: 当Go运行时中没有对* Stuff的引用时,垃圾收集器是否可以调用Stuff.Free()? 我在这里有意义吗? 也许更直接的问题是:是否有可能通过编写一个在该对象的引用为零时运行

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner