Java如何使用XMX和XMS内存?

4
我有一个配置好的 TomcatXMS=XMX 都配置为 4G。
但是,如果我将 XMS 设置为 1G,会发生什么呢?
据我了解,JVM 将使用提供的 1G 内存启动 Tomcat。然后,如果应用程序需要更多内存,JVM 将在某个时期将其增加到 4G。为此,Java 必须运行一些操作(调整大小,在内存中重新分配页面?)- 这需要一些时间和 CPU 资源,正确吗?
Tomcat 的应用程序不再需要这么多内存时会发生什么?Java 会再次运行操作以减少已使用的内存吗?
谢谢。
P.S. 为什么我问 - 在 XMS=1GXMX=4G 的情况下,Apache Jmeter 给出的结果要比我使用 XMXXMS 都为 4G 来启动Tomcat 的结果要少得多(ThroughputAverage)。

可能是 当启动 JVM 时,Xms 和 Xmx 参数是什么? 的重复。 - dotancohen
2个回答

2
是的,JVM需要分配更多的内存并重新排列所有堆空间(Eden、from、to、old和PermGen)以适应新的内存。如果您计划让您的Web应用程序使用一定量的堆空间,则最好性能方面预先分配整个堆。

JVM一旦从操作系统中获取内存就不会释放它。因此,如果您需要4GiB堆,并且JVM最终获取了堆,则您的堆将保持在4GiB,直到JVM终止。


我听说新的G1(“垃圾优先”)垃圾收集器可以将内存返回给操作系统,但我无法在任何地方找到相关文档。重新调整堆的工作量非常大,因此通常应避免缩小整个堆。如果您不希望JVM进程占用超过X数量的内存,请一开始就不要允许它;) - Christopher Schultz

1
当将Xms和Xmx设置为相等的值时,JVM不必调整堆大小,从而避免了JVM在这方面花费的时间。在您使用Jmeter进行压力测试时,这确实会给出更好的结果,因为服务器需要增加堆。一旦您完成Jmeter测试,Tomcat会在一些垃圾收集器活动之后减少堆,从而销毁不需要的对象。

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