运行 Spring 引导应用程序的初始内存量

Initial amount of memory to run a Spring Boot application

我是否应该为 运行 一个 Spring 引导应用程序设置任何初始内存量?

例如,对于 运行 嵌入式 Tomcat/Undertow 应用程序,我们可以为 -Xms 和 -Xmx java 选项设置典型的内存量。

如何找出我需要为 运行 设置我的应用程序的值?

您需要的最大内存量几乎完全取决于您的应用程序和它需要能够处理的负载。使用像 JMeter 这样的工具来模拟一些负载是查看需要多少内存的一种方法。

最小内存量也取决于您的应用程序,但您至少需要 25MB 左右。 This blog post 提供了大量附加信息。

您应该 运行 JavaMissionControl 或其他 Profiler 来查看您的实际内存需求。您可以通过命令提示符 运行ning 'jmc' 运行 安装 Java 的服务器(和路径中)上的 JavaMissionControl,然后附加到本地 JVM。您也可以附加到远程 JVM。有关详细信息,请参阅此 link:http://www.oracle.com/technetwork/java/javaseproducts/mission-control/index.html

通常我所做的是将最大内存设置得比需要的高,max = 1GB 似乎是一个很好的起点。您将希望在典型的 activity 期间观察应用程序的内存配置文件。请注意,当您将初始堆大小设置为 64mb 时,垃圾收集器正在 运行 设置一个方案,该方案不会启动主要垃圾收集,直到出于性能原因(垃圾收集很昂贵)。结果,您会看到内存随着时间的推移逐渐增加到堆大小的 80% 左右(此 % 是可调整的)。一旦达到阈值,垃圾收集就会启动,您将看到使用的 JVM 内存再次下降到非常低的水平。

通常我要查找的是在一系列主要垃圾回收之后持续使用的内存级别。因此,假设在 运行 连接您的应用程序后,您会发现固态内存使用量在一次主要垃圾回收后一直下降到 40Mb 左右。因此,我通常会将最小 JVM 大小设置为大约这个数量,因为我知道我总是至少需要那么多。

现在您知道了最低要求的合适起点,那么需要的最大内存是多少?好吧,这需要更多的分析和反复试验。我所做的是开始降低最大内存设置并降低配置文件一段时间。您正在寻找的是主要垃圾收集的频率和 JVM CPU 利用率达到持续的高值。

我会不断减少内存,直到我看到主要垃圾收集在短时间内在负载下发生多次,并且 CPU 在这些垃圾收集期间出现峰值。一旦我看到这种行为,我就会慢慢增加最大内存,直到这种行为停止,以找到所需最大内存的最佳点。

这是为 min/max 内存设置找到合理值的一种非常简单的方法,并且在大多数常见应用场景中对我来说效果很好。当然还有许多其他更详尽的方法来分析您的应用程序以微调内存设置和垃圾收集 schemes/settings 如果您真的想微调您的要求。

通常我会在没有任何标记的情况下启动 jar 并通过 'Java VisualVM' 开始监控。根据我设置的实际数据 -Xmx。就这样。