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

时间:2018-09-26 03:06:04

标签: garbage-collection jvm

我怀疑JVM垃圾收集器如何在不同的Xmx和Xms值以及机器内存大小下工作: 垃圾收集器在以下情况下将如何工作:

1. Machine memory size = 7.5GB
   Xmx = 1024Mb
   Number of processes = 16
   Xms = 512Mb

我知道16 * 512Mb已经超出了机器的内存大小。在这种情况下,垃圾收集器将如何工作。我认为在这种情况下,整个内存使用量将为7.5GB。流程将能够做到这一点吗?否则它们都会被卡住?

2. Machine memory size = 7.5GB
   Xmx = 320MB
   Xms is not defined.
   Number of Processes = 16

在这种情况下,16 * 320Mb应该小于7.5GB。但就我而言,内存使用率再次达到7.5GB。可能吗?还是我的应用程序中可能有内存泄漏?

所以,基本上,我想了解垃圾收集器何时运行?每当应用程序使用的内存达到Xmx值时,它都会运行吗?还是根本不相关?

1 个答案:

答案 0 :(得分:0)

这里有几件事情要理解,然后根据您的情况考虑。

每个JVM进程都有其自己的虚拟地址空间,该虚拟地址空间受到操作系统的保护,不会受到其他进程的影响。 OS将地址的物理范围(称为页面)映射到每个进程的虚拟地址空间。如果需要的物理页面多于可用的物理页面,那么一段时间未使用的页面将被写入磁盘(称为页面调度),然后可以重新使用。当再次需要这些保存页面的数据时,它们将被读回到相同或不同的物理页面。这样,您可以在具有8Gb物理内存的计算机上轻松地运行16个或更多的JVM,这些JVM具有1Gb的堆。问题在于,对磁盘的分页越多,由于磁盘IO的访问速度要比RAM访问速度慢几个数量级,因此降低了应用程序的性能。这也是单个JVM的堆空间不应大于物理内存的原因。

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

这里的关键是操作系统的虚拟内存系统,使它看起来可能正在使用比计算机上实际拥有的更多的内存。