Xms和Xmx以及XX:MaxPermSize之间的区别是什么?

39

什么是它们之间的区别?

-Xms4096m
-Xmx2048M 
-XX:MaxPermSize=712M

我对这两个参数-Xmx2048M-XX:MaxPermSize=712M感到困惑

如果我使用-Xmx2048M-Xmx2048m会发生什么?

1个回答

69

Java对象存储在称为堆(heap)的区域中,而类对象和方法对象等元数据存储在永久代(Permanent Generation)或Perm Gen区域中。永久代不是堆的一部分。

堆在JVM启动时创建,并且在应用程序运行时可以增加或减小其大小。当堆变满时,垃圾将被收集。在垃圾回收期间,不再使用的对象将被清除,从而为新对象腾出空间。

-Xmssize 指定初始堆大小。

-Xmxsize 指定最大堆大小。

-XX:MaxPermSize=size 设置最大永久代空间大小。这个选项已经在JDK 8中废弃,并由-XX:MaxMetaspaceSize选项取代。

大小以字节表示。附加字母kK表示千字节,mM表示兆字节,gG表示千兆字节。

参考资料:

Java内存池是如何划分的?

什么是永久代?

Java(JVM)内存模型 - Java内存管理

Java 7 SE命令行选项

Java 7 HotSpot VM选项


谢谢,但是如果我增加这个 -XX:MaxPermSize=8192m 的大小会发生什么?因为我正在面对性能问题,应用程序处理变慢了。 - Sanjay Dutt
3
如果您遇到性能问题,需要诊断并找出原因。8192m是过多的perm gen空间。通常只有当您遇到"java.lang.OutOfMemoryError: PermGen space"错误时才需要增加perm gen。如果垃圾收集频繁触发,则可能需要使用“-xmx”增加堆内存,但请注意操作系统磁盘缓存可用的内存将会变少。可以查看https://rimuhosting.com/knowledgebase/linux/java/-Xmx-settings和[Tuning Tomcat Performance For Optimum Speed](https://www.mulesoft.com/tcat/tomcat-performance)来进行调优。 - JRL
嗨@JRL,感谢您提供这个简短明了的解释!我和我的团队只有一个最后的问题,也许您能帮助我们:这两个内存量加起来了吗?假设我允许我的Java应用程序在Kubernetes上管理2048M,并且该应用程序设置了-Xmx 2048M和-XX:MaxPermSize 384M。是更好地允许2560M的内存到我的应用程序中?还是2048M就足够了? - lboix
1
@lboix 这两个区域是独立的,它们的内存相加,因此如果两者都达到最大值,则至少需要2432M。 - JRL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接