Java何时调用垃圾收集器

Java何时调用垃圾收集器,java,memory,heap-memory,Java,Memory,Heap Memory,我读了很多关于Java堆的帖子。我看到如果我们得到java.lang.OutOfMemoryError,我们应该增加-Xmx来解决这个问题 例如 java -Xmx2048m -Xms256m 这将使Java使用的堆内存增加到2048MB。现在我要问的问题是 关于上述设置的问题: Java在调用垃圾收集器之前是否会等待堆空间达到256MB?这就是为什么我们希望-XMx和-Xms具有相同的值,以便Java在达到最大内存分配之前不调用堆管理的原因吗 如果有人能在Xmx表示最大java堆和Xms表示

我读了很多关于Java堆的帖子。我看到如果我们得到java.lang.OutOfMemoryError,我们应该增加-Xmx来解决这个问题

例如

java -Xmx2048m -Xms256m
这将使Java使用的堆内存增加到2048MB。现在我要问的问题是

关于上述设置的问题:

Java在调用垃圾收集器之前是否会等待堆空间达到256MB?这就是为什么我们希望-XMx和-Xms具有相同的值,以便Java在达到最大内存分配之前不调用堆管理的原因吗

如果有人能在Xmx表示最大java堆和Xms表示最小java堆的旁边提供一些关于-Xmx和-Xms的额外细节,我将不胜感激

-Xms:最小堆大小。拥有-Xms=1.8GB(32位)可能是不好的,因为您不允许内存用于其他任何东西

-Xmx:最大堆大小(例如:-Xmx1024)

请参见此处了解更多信息:

-Xms:最小堆大小。拥有-Xms=1.8GB(32位)可能是不好的,因为您不允许内存用于其他任何东西

-Xmx:最大堆大小(例如:-Xmx1024)


有关更多信息,请参见此处:

第一个问题的答案是:视情况而定。您可以设置不同的GC策略,甚至可以说服JVM在堆满之前不运行GC,但这通常不是一个好主意。这肯定不是通常发生的情况,相反,堆的用途不同,GC是由它们的填充触发的

回答第二个问题:不,这是一个完全不同的问题

使用
-Xms256m
时,JVM将在启动时向操作系统请求256 MB的内存

如果用完了,它将要求更多,直到达到
-Xmx
指定的金额。要求操作系统为您的进程分配更多内存需要时间,因此最好避免在服务器上进行,在服务器上,您可以几乎准确地预测应用程序的可用内存量

请注意,上面的过程只与GC间接相关,GC只清除操作系统已分配给JVM的堆


编辑:要检查到底发生了什么,可以使用
-verbose:gc
命令行选项启动JVM。

第一个问题的答案是:这取决于具体情况。您可以设置不同的GC策略,甚至可以说服JVM在堆满之前不运行GC,但这通常不是一个好主意。这肯定不是通常发生的情况,相反,堆的用途不同,GC是由它们的填充触发的

回答第二个问题:不,这是一个完全不同的问题

使用
-Xms256m
时,JVM将在启动时向操作系统请求256 MB的内存

如果用完了,它将要求更多,直到达到
-Xmx
指定的金额。要求操作系统为您的进程分配更多内存需要时间,因此最好避免在服务器上进行,在服务器上,您可以几乎准确地预测应用程序的可用内存量

请注意,上面的过程只与GC间接相关,GC只清除操作系统已分配给JVM的堆


Edit:要检查到底发生了什么,您可以使用
-verbose:gc
命令行选项启动JVM。

垃圾收集发生在代数满时

堆上有两个主要的世代:年轻的和年老的。年轻一代也被称为新一代,或伊甸园空间。老一代被细分为幸存者空间和终身世代

新分配的对象从年轻一代开始,如果它们在垃圾收集中幸存下来,则会移动到老一代。垃圾收集在年轻一代中运行得更频繁

这些是你的:

  • -Xms
    值(初始/最小堆大小,所有代)

  • -Xmx
    值(所有代的最大堆大小)

  • -Xmn
    值(新一代尺寸,可替代
    -XX:NewSize
    如下)

  • -XX:MinHeapFreeRatio=
    最小值(自由空间与活动对象的最小期望比例,以百分比表示)

  • -XX:MaxHeapFreeRatio=
    最大值(自由空间与活动对象的最大期望比例,以百分比表示)

  • -XX:NewRatio=
    ratio(旧代与新代的比率:默认为2,表示2:1,即堆是旧代的2/3)

  • -XX:NewSize=
    大小(初始/最小新一代大小)

  • -XX:MaxNewSize=
    大小(新一代的最大大小)

  • -XX:+AggressiveHeap
    (初始堆的大小根据物理内存的大小计算,并尝试最大限度地利用堆的物理内存)


垃圾收集发生在代满时

堆上有两个主要的世代:年轻的和年老的。年轻一代也被称为新一代,或伊甸园空间。老一代被细分为幸存者空间和终身世代

新分配的对象从年轻一代开始,如果它们在垃圾收集中幸存下来,则会移动到老一代。垃圾收集在年轻一代中运行得更频繁

这些是你的:

  • -Xms
    值(初始/最小堆大小,所有代)

  • -Xmx
    值(所有代的最大堆大小)

  • -Xmn
    值(新一代尺寸,可替代
    -XX:NewSize
    如下)

  • -XX:MinHeapFreeRatio=
    最小值(自由空间与活动对象的最小期望比例,以百分比表示)

  • -XX:MaxHeapFreeRatio=
    最大(所需的自由空间与活动对象的最大比例