2016-02-12 124 views
2

是否有任何初始量的内存需要设置才能运行Spring Boot应用程序?运行Spring Boot应用程序的初始内存量

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

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

回答

9

您应该运行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在这些垃圾收集期间迅速增加。一旦我看到这种行为,我会慢慢增加最大内存,直到停止行为,找到所需最大内存的最佳位置。

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

+0

如果我没有设置任何-Xms和Xmx,则应用程序将使用InitialHeapSize:= 67108864(64Mb)和MaxHeapSize:= 1073741824(1GB)获取Java Solaris的默认堆。通过命令“prstat -a”显示几乎全部使用它的应用程序(774Mb)。同样,如果我设置-Xms128m -Xmx128m,应用程序也可以正常运行,所以这是我的问题,如何为它找到适量的内存?原因没有设置任何Java运行使用远远多于需要 –

+0

我相信这就是我在我的答案中描述...如何确定Xms和Xmx的正确值。 – pczeus

+0

但是,如果没有设置Xmx,Java是否有任何理由使用几乎所有可用的maxheap(1GB),并且同时如果设置128Mb,应用程序也可以正常工作? –

1

您需要的最大内存量取决于您的应用程序和它需要处理的负载。使用类似JMeter的工具来模拟一些负载是查看需要多少内存的一种方法。

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

+0

如果我没有设置任何-Xms和Xmx,应用程序将以InitialHeapSize:= 67108864(64Mb)和MaxHeapSize:= 1073741824(1GB)获取Java Solaris的默认堆。通过命令“prstat -a”显示几乎全部使用它的应用程序(774Mb)。同样,如果我设置-Xms128m -Xmx128m,应用程序也可以正常运行,所以这是我的问题,如何为它找到适量的内存?原因没有设置任何Java运行使用远远超过需要。 –

0

通常我没有任何标志的启动jar,并开始通过'Java VisualVM'进行监视。根据我设定的实际数据-Xmx。像那样。

相关问题