我应该设置任何初始内存量来运行 Spring Boot 应用程序吗?
例如,要运行嵌入式Tomcat/Undertow应用程序,我们可以为-Xms和-Xmx java选项设置典型的内存量。
如何找出运行应用程序需要设置哪些值?
您应该运行 JavaMissionControl 或其他 Profiler 以查看实际的内存需求。您可以在安装 Java 的服务器上(以及在路径中(运行 JavaMissionControl,方法是从命令提示符运行"jmc",然后连接到本地 JVM。您也可以连接到远程 JVM。有关更多信息,请参阅此链接:http://www.oracle.com/technetwork/java/javaseproducts/mission-control/index.html
通常,我所做的是将最大内存设置为高于所需的内存,max = 1GB似乎是一个很好的起点。您需要在一段时间的典型活动中观察应用程序的内存配置文件。请注意,当您将初始堆大小设置为 64mb 时,垃圾回收器正在运行的方案在出于性能原因(垃圾回收成本高昂(之前不会启动主要垃圾回收。因此,您将看到内存随着时间的推移而蠕变到堆大小的 80% 左右(此百分比是可调的(。一旦达到阈值,垃圾回收就会启动,您将看到使用的 JVM 内存再次下降得非常低。
通常,我正在寻找的是一系列主要垃圾收集后持续使用的内存级别。因此,假设在运行应用程序后,您会看到主要垃圾回收后的固态内存使用量始终下降到40Mb左右。因此,我通常会将最小 JVM 大小设置为大约这个数量,因为我知道我总是至少需要那么多。
现在您知道了最低要求的良好起点,那么所需的最大内存是多少?好吧,这需要更多的分析和反复试验。我所做的是开始降低最大内存设置并配置文件一段时间。您正在寻找的是主要垃圾回收的频率和 JVM CPU 利用率始终达到高值。
我会不断减少内存,直到我看到在负载下的短时间内多次发生重大垃圾收集,并且在这些垃圾回收期间 CPU 峰值上升。一旦我看到这种行为,我就会慢慢增加最大内存,直到该行为停止,以找到所需的最大内存的最佳点。
这是查找最小/最大内存设置的合理值的非常简单的方法,在大多数常见的应用程序场景中对我来说非常有效。当然,如果您真的想微调您的要求,还有许多其他更详尽的方法来分析您的应用程序以微调内存设置和垃圾回收方案/设置。
所需的最大内存量几乎完全取决于您的应用程序及其需要能够处理的负载。使用 JMeter 等工具来模拟某些负载是查看需要多少内存的一种方法。
最小内存量也取决于您的应用程序,但您至少需要 25MB 左右。这篇博文提供了许多其他信息。
通常我会启动一个没有任何标志的jar,然后通过"Java VisualVM"开始监控。根据实际数据,我正在设置 -Xmx。