1) 我们的应用程序是一个 Spring Boot/Java 8 应用程序,我们使用它来运行 xms = 256 MB,xmx = 2 GB
2) 我们的发布工程师正在unix服务器上运行TOP命令,其中 应用程序正在运行并报告应用程序正在使用 3.5 GB
3) 当我使用 VisualVM 分析应用程序的生产 JVM 实例时, 我看到已用堆大小仅显示大约 1.4 GB
对于为什么上面#2 和#3 之间的内存消耗数字如此不同,您有什么想法吗?
感谢您的反馈。
最佳答案
-Xmx
参数仅设置 Java 堆 的最大大小。 Java 堆之外的任何内存都不受 -Xmx
限制/控制。
非堆内存使用的示例包括线程堆栈、直接内存和永久代。
使用的总虚拟内存(由 top
报告)是堆使用量(您已使用 -Xmx
限制)和非堆使用量(其中不能被 -Xmx
限制)。
因此,#2 和 #3 中的数字不具有可比性,因为它们不是对同一事物的测量。
它们永远不会相同,但如果您想让它们彼此更接近(或者至少对所使用的虚拟内存量有更多控制),那么您可以考虑使用...
-XX:MaxPermSize
限制永久代大小-XX:MaxHeapFreeRatio
促进更积极的堆收缩
关于java - Spring Boot应用程序内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426877/