【问题标题】:Initial amount of memory to run a Spring Boot application运行 Spring Boot 应用程序的初始内存量
【发布时间】:2016-05-24 02:56:44
【问题描述】:

我应该设置什么初始内存量来运行 Spring Boot 应用程序?

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

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

【问题讨论】:

  • 您找到解决方案了吗?我有一些和你一样的问题
  • 是的,使用 JMC 检查您的应用程序的行为。

标签: java spring tomcat spring-boot undertow


【解决方案1】:

您应该运行 JavaMissionControl 或其他 Profiler 来查看您的实际内存需求。您可以通过从命令提示符运行“jmc”,然后附加到本地 JVM,在安装了 Java 的服务器上(以及在路径中)运行 JavaMissionControl。您也可以附加到远程 JVM。欲了解更多信息,请参阅此链接:http://www.oracle.com/technetwork/java/javaseproducts/mission-control/index.html

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

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

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

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

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

【讨论】:

  • 如果我没有设置任何 -Xms 和 Xmx,应用程序将获取 Java Solaris 的默认堆,InitialHeapSize:=67108864 (64Mb) 和 MaxHeapSize:=1073741824 (1GB)。通过命令“prstat -a”显示应用程序几乎使用了所有它(774Mb)。同时,如果我设置 -Xms128m -Xmx128m 应用程序也可以正常运行,所以我的问题是如何找到合适的内存量?导致没有设置任何 java 运行使用的东西比需要的多
  • 我相信这就是我在回答中所描述的......如何确定 Xms 和 Xmx 的正确值。
  • 但是,如果没有设置 Xmx,Java 使用几乎所有可用的 maxheap (1GB),同时如果设置为 128Mb,应用程序也能正常工作,有什么理由吗?
【解决方案2】:

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

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

【讨论】:

  • 如果我没有设置任何 -Xms 和 Xmx,应用程序将获取 Java Solaris 的默认堆,InitialHeapSize:=67108864 (64Mb) 和 MaxHeapSize:=1073741824 (1GB)。通过命令“prstat -a”显示应用程序几乎使用了所有它(774Mb)。同时,如果我设置 -Xms128m -Xmx128m 应用程序也可以正常运行,所以我的问题是如何找到合适的内存量?导致没有设置任何 java 运行使用的东西比需要的多。
【解决方案3】:

通常我会启动一个没有任何标志的 jar 并通过“Java VisualVM”开始监控。根据我设置的实际数据-Xmx。就这样。

【讨论】:

    猜你喜欢
    • 2019-11-30
    • 2017-04-20
    • 2018-11-13
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多