java - Java 如何使用 XMX 和 XMS 内存?

标签 java tomcat memory

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

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

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

Tomcat的应用程序不需要那么多内存后发生了什么? Java 将再次运行操作以减少已用内存?

谢谢。

附言为什么我要问 - 使用 XMS=1GXMX=4G Apache Jmeter 给出的结果要少得多(吞吐量Average),这比我使用 XMXXMS 都是 4G 启动 Tomcat 时要好。

最佳答案

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

JVM 永远不会释放它从操作系统中占用的内存。因此,如果您需要 4GiB 堆并且 JVM 最终占用了它,您的堆将保持在 4GiB 直到 JVM 终止。

关于java - Java 如何使用 XMX 和 XMS 内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20662221/

相关文章:

c++ - 虚拟继承是如何工作的?

java - 如何使用 Homebrew 在 osx macOS Mojave 上安装 Java 8?

xml - Swift 内存管理漏洞 : boundary case, 功能或错误?

java - 将 SDP 数据从字节 [] 转换为对象?

java - Tomcat 能否将 OutOfMemory 隔离到单个请求而不是“停止内存不足而不是装死”?

windows - Log4j 不将 System.out 写入文件

spring - 使用 tomcat 7 部署时出现 slf4j 错误

c - 嵌套结构中的数据如何存储和填充?

java - 使用 Java 正则表达式模式解析字符串?

java - 有没有办法使用 Java 中的 Azure Functions 将带有 header 数据的事件输出到 Azure 事件中心?