Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何减少JVM中的提交堆内存_Java_Memory_Memory Management_Jvm - Fatal编程技术网

Java 如何减少JVM中的提交堆内存

Java 如何减少JVM中的提交堆内存,java,memory,memory-management,jvm,Java,Memory,Memory Management,Jvm,我们的JVM消耗的内存比预期的要多。我们做了一些分析,发现没有泄漏。使用的堆内存最大为2.9GB,但在空闲时间内降至800MB。但提交的堆增加到3.5GB(有时为4GB),并且从未下降。同样在空闲时间之后,当使用的堆从800 MB增加时,提交的堆内存从3.5 GB增加。因此,我们的服务器很快就会达到最大内存大小,我们必须每隔一天重新启动它们 我的问题是 我的理解是,提交的堆内存是当前分配的内存。当使用堆内存减少时,为什么提交的内存也没有减少 当使用的堆内存从其级别(800 MB)增加时,提交的堆

我们的JVM消耗的内存比预期的要多。我们做了一些分析,发现没有泄漏。使用的堆内存最大为2.9GB,但在空闲时间内降至800MB。但提交的堆增加到3.5GB(有时为4GB),并且从未下降。同样在空闲时间之后,当使用的堆从800 MB增加时,提交的堆内存从3.5 GB增加。因此,我们的服务器很快就会达到最大内存大小,我们必须每隔一天重新启动它们

我的问题是

  • 我的理解是,提交的堆内存是当前分配的内存。当使用堆内存减少时,为什么提交的内存也没有减少
  • 当使用的堆内存从其级别(800 MB)增加时,提交的堆内存也从其级别(3.5GB)增加
  • 我们的服务器中有以下内存设置:

    -Xmx4096M -Xms1536M -XX:PermSize=128M -XX:MaxPermSize=512M
    

    您可以尝试调优-XX:MaxHeapFreeRatio,它是“GC之后的最大堆空闲百分比,以避免收缩”。默认值=70

    jvm分配的提交方式;您的最大堆大小是4gigs,因此,在需要时,提交的内存将增加到该阈值。然后,它可能会返回给系统,但在您的情况下,jvm可能不觉得有必要这样做。我只会给jvm您可用的内存量,例如3 GB,然后您就不需要重新启动它。我添加了这一点,但在GC之后堆大小不会缩小。出于测试目的,我将XX:MaxHeapFreeRatio设为10,但实际的可用空间大于10。我在一些论坛上读到,JVM一旦获得内存,就永远不会释放内存。这是真的还是我需要添加任何其他参数来控制它。当我添加-XX:+UseSerialGC时,它现在可以工作了,如果我给出这个选项,我还需要面对其他问题吗?好的,理解。它还会影响CPU利用率吗?如果不使用它,堆大小不会缩小。我们还有其他方法吗?尝试使用G1GC它既快又能收缩(似乎),只有在jvisualvm中单击“执行GC”时它才起作用。但当系统执行gc时,它并没有减少堆的大小,它只是减少使用的堆。我们不能每天手动执行“执行gc”