【问题标题】:How Java uses XMX and XMS memory?Java 如何使用 XMX 和 XMS 内存?
【发布时间】:2013-12-18 15:35:21
【问题描述】:

我的 Tomcat 配置了 XMS=XMX(均为 4G)。

但是 - 如果我将 XMS 设置为例如 1G 会怎样?

据我了解 - JVM 将使用提供的 1G 内存启动 Tomcat。然后,如果应用程序需要更多 - JVM 将在一段时间内将其提升到 4G。要提升它 - Java 必须运行一些操作(调整大小、重新定位内存中的页面?) - 这需要一些时间和 CPU 资源,对吗?

Tomcat 的应用程序不需要这么多内存之后发生了什么? Java 会再次运行操作以减少使用的内存吗?

谢谢。

附:为什么我要问 - 使用 XMS=1GXMX=4G Apache Jmeter 给出的结果(ThroughputAverage)比我启动 Tomcat XMXXMS 都是 4G。

【问题讨论】:

标签: java tomcat memory


【解决方案1】:

是的,JVM 必须分配更多内存并重新安排所有堆空间(Eden、from、to、old 和 PermGen)以适应新内存。如果你打算让你的 webapp 使用一定数量的堆空间,那么你最好在性能方面预先分配整个堆。

一旦完成,JVM 将永远不会释放它从操作系统中获取的内存。因此,如果您需要 4GiB 堆并且 JVM 最终占用了它,那么在 JVM 终止之前,您的堆将保持在 4GiB。

【讨论】:

  • 我听说新的 G1(“垃圾优先”)垃圾收集器可以将内存返回给操作系统,但我无法在任何地方找到相关文档。重新调整堆大小所需的工作量非常大,我认为通常可以避免缩小整个堆的大小。如果您不希望您的 JVM 进程占用超过 X 量的内存,那么一开始就不允许它;)
【解决方案2】:

当将 Xms 和 Xmx 设置为相等的值时 JVM 将不必调整堆大小并避免 JVM 花费在该堆上的时间。 在您的情况下,这确实会产生更好的结果,因为使用 Jmeter,您正在强调需要增加堆的服务器。一旦你完成了 Jmeter ,你的 Tomcat 将在一些垃圾收集器活动之后减少堆,这将破坏不需要的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多