gpt4 book ai didi

java - Tomcat服务内存超过max无故障

转载 作者:行者123 更新时间:2023-11-28 22:06:05 25 4
gpt4 key购买 nike

我已经阅读了大量的帖子,但显然我在理解上遗漏了一些东西。我有一个 Tomcat 服务,它安装了:

--JvmMx=1000
--JvmMs=128

我已经通过以下调用验证了这些设置是否成功:

PsExec.exe -s {jdk}\bin\jinfo.exe -flag MaxHeapSize {pid}

但是,此服务的 tomcat7.exe 进程持续增长,超过此最大值 3 倍或更多倍,直到它使服务器陷入爬行状态。奇怪的是,这只是一台服务器上的问题;在其他任何地方它都相当稳定并且保持在限制之下。我还在我的开发环境中寻找内存泄漏,但没有发现。

为了调试它,我试过像这样强制 GC:

 PsExec.exe -s {jdk}\bin\jcmd.exe {pid} GC.run

但是这个好像没有效果。所以接下来我通过将其添加到安装中来设置它以进行 jconsole 监控:

tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.port=8086"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.ssl=false"
tomcat7.exe //US//%SERVICE_NAME% ++JvmOptions="-Dcom.sun.management.jmxremote.authenticate=false"

现在(当然!)它表现良好。 GC 显然在工作,进程内存保持在限制以下。

我很困惑。最大堆是 1 GB,永久内存是 90 MB,堆栈大小是默认的,所以大约 128KB?而没有增长的线程数“只有”67。那么进程内存如何才能上升到 3+ GB?为什么它不抛出内存不足异常?

即使是现在,根据 jconsole 的“行为良好”的服务也只使用了大约 50 MB 的堆,在 57 个线程上运行。然而,任务管理器显示 71 个线程使用 800 MB。我认为差异是由于 Tomcat 造成的,是吗?请帮助我填补我的理解空白。

最佳答案

Java 使用的内存多于 Java 堆空间所需的内存。它被称为“ native 内存”,不计入您提到/检查的任何内存空间。

这篇文章会让你大开眼界: http://www.evanjones.ca/java-native-leak-bug.html

(FWIW,将服务器进程的 -Xms-Xmx 设置为不同的值只是浪费时间。将它们设置为相同的值,以便堆不需要在“上升”到最大堆大小的过程中多次调整大小。如果您要向服务器进程提供例如 1GiB,您不妨立即使用它。 )

关于java - Tomcat服务内存超过max无故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45866930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com