启动Spring Boot应用程序时配置堆大小

2023/05/12

1. 简介

在本教程中,我们将学习如何在启动Spring Boot应用程序时配置堆大小。我们将配置-Xms和-Xmx设置,它们对应于起始堆大小和最大堆大小。

然后,我们将首先使用Maven在命令行上使用mvn启动应用程序时配置堆大小,并了解如何使用Maven插件设置这些值。接下来,我们将我们的应用程序打包到一个jar文件中,并使用提供给java -jar命令的JVM 参数运行它。

最后,我们将创建一个设置JAVA_OPTS的.conf文件,并使用Linux System V Init技术将我们的应用程序作为服务运行

2. 从Maven运行

2.1 传递JVM参数

让我们首先创建一个简单的REST控制器,该控制器返回一些基本的内存信息,我们可以使用这些信息来验证我们的设置:

@GetMapping("memory-status")
public MemoryStats getMemoryStatistics() {
    MemoryStats stats = new MemoryStats();
    stats.setHeapSize(Runtime.getRuntime().totalMemory());
    stats.setHeapMaxSize(Runtime.getRuntime().maxMemory());
    stats.setHeapFreeSize(Runtime.getRuntime().freeMemory());
    return stats;
}

让我们使用mvn spring-boot:run按原样运行它来获取基线,一旦我们的应用程序启动,我们就可以使用curl来调用我们的REST控制器:

curl http://localhost:8080/memory-status

我们的结果会因我们的机器而异,但看起来像这样:

{"heapSize":333447168,"heapMaxSize":5316280320,"heapFreeSize":271148080}

对于Spring Boot 2.x,我们可以使用-Dspring-boot.run将参数传递给我们的应用程序。

让我们使用-Dspring-boot.run.jvmArguments将起始堆大小和最大堆大小传递给我们的应用程序:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Xms2048m -Xmx4096m"

现在,当我们调用端点时,我们应该看到指定的堆设置:

{"heapSize":2147483648,"heapMaxSize":4294967296,"heapFreeSize":2042379008}

2.2 使用Maven插件

通过在pom.xml文件中配置spring-boot-maven-plugin,我们可以避免每次运行应用程序时都必须提供参数:

让我们配置插件来设置我们想要的堆大小:

<plugins>
	<plugin>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-maven-plugin</artifactId>
		<executions>
			<execution>
				<configuration>
					<mainClass>cn.tuyucheng.taketoday.heap.HeapSizeDemoApplication</mainClass>
				</configuration>
			</execution>
		</executions>
		<configuration>
			<executable>true</executable>
			<jvmArguments>
				-Xms256m
				-Xmx1g
			</jvmArguments>
		</configuration>
	</plugin>
</plugins>

现在,我们可以只使用mvn spring-boot:run运行我们的应用程序,并在ping端点时查看正在使用的指定JVM参数:

{"heapSize":259588096,"heapMaxSize":1037959168,"heapFreeSize":226205152}

我们在插件中配置的任何JVM参数将优先于使用-Dspring-boot.run.jvmArguments从Maven运行时提供的任何参数

3. 使用java -jar运行

如果我们从jar文件运行我们的应用程序,我们可以为java命令提供JVM参数。

首先,我们必须在我们的Maven文件中指定<packaging>为jar:

<packaging>jar</packaging>

然后,我们可以将我们的应用程序打包成jar文件:

mvn clean package

现在我们有了jar文件,我们可以使用java -jar运行它并覆盖堆配置:

java -Xms512m -Xmx1024m -jar target/spring-boot-runtime-2.jar

然后调用我们的端点来检查内存值:

{"heapSize":536870912,"heapMaxSize":1073741824,"heapFreeSize":491597032}

4. 使用.conf文件

最后,我们将学习如何使用.conf文件来设置作为Linux服务运行的应用程序的堆大小。

让我们首先创建一个与我们的应用程序jar文件同名且扩展名为.conf的文件:spring-boot-runtime-2.conf。

我们现在可以将它放在resources下的文件夹中,并将我们的堆配置添加到JAVA_OPTS:

JAVA_OPTS="-Xms512m -Xmx1024m"

接下来,修改我们的Maven构建以将spring-boot-runtime-2.conf文件复制到我们target文件夹的jar文件中:

<build>
	<finalName>${project.artifactId}</finalName>
	<resources>
		<resource>
			<directory>src/main/resources/heap</directory>
			<targetPath>${project.build.directory}</targetPath>
			<filtering>true</filtering>
			<includes>
				<include>${project.name}.conf</include>
			</includes>
		</resource>
	</resources>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<configuration>
						<mainClass>cn.tuyucheng.taketoday.heap.HeapSizeDemoApplication</mainClass>
					</configuration>
				</execution>
			</executions>
			<configuration>
				<executable>true</executable>
			</configuration>
		</plugin>
	</plugins>
</build>

我们还需要将executable设置为true才能将我们的应用程序作为服务运行

我们可以打包我们的jar文件并使用Maven复制我们的.conf文件:

mvn clean package spring-boot:repackage

接下来创建我们的init.d服务:

sudo ln -s /path/to/spring-boot-runtime-2.jar /etc/init.d/spring-boot-runtime-2

现在,开始我们的应用程序:

sudo /etc/init.d/spring-boot-runtime-2 start

然后,当我们调用端点时,我们应该看到我们在.conf文件中指定的JAVA_OPT值得到了配置:

{"heapSize":538968064,"heapMaxSize":1073741824,"heapFreeSize":445879544}

5. 总结

在这个简短的教程中,我们研究了如何为运行Spring Boot应用程序的三种常见方式覆盖Java堆设置。我们从Maven开始,既在命令行修改值,也通过在Spring Boot Maven插件中设置它们。

接下来,我们使用java -jar并传入JVM参数来运行我们的应用程序jar文件。

最后,我们通过设置一个.conf文件,并创建一个System V init服务来运行我们的应用程序。

还有其他解决方案可以从Spring Boot fat jar创建服务和守护进程,其中许多提供了覆盖JVM参数的特定方法。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章