啟動Spring Boot應用程序時配置堆大小
1.簡介
在本教程中,我們將學習啟動Spring Boot應用程序時如何配置堆大小。我們將配置-Xms
和-Xmx
設置,它們對應於起始堆大小和最大堆大小。
然後,當在命令行上mvn
啟動應用程序時,我們將首先使用Maven來配置堆大小。我們還將研究如何使用Maven插件設置這些值。接下來,我們將應用程序打包到jar
文件中,並使用提供給java -jar
命令的JVM參數運行它。
最後,我們將創建一個.conf
文件,該文件設置JAVA_OPTS
並使用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>com.baeldung.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}
-Dspring-boot.run.jvmArguments
從Maven運行時,我們在插件中配置的所有JVM參數將優先於提供的所有JVM參數。
3.使用java -jar
如果從aj ar
文件運行應用程序,則可以向java
命令提供JVM參數。
首先,我們必須在我們的Maven文件jar
<packaging>jar</packaging>
然後,我們可以將應用程序打包到aj ar
文件中:
mvn clean package
現在我們有了j ar
文件,可以使用java -jar
運行它並覆蓋堆配置:
java -Xms512m -Xmx1024m -jar target/spring-boot-runtime-2.jar
讓我們curl
端點以檢查內存值:
{"heapSize":536870912,"heapMaxSize":1073741824,"heapFreeSize":491597032}
4.使用.conf
文件
最後,我們將學習如何使用.conf
文件在作為Linux服務運行的應用程序上設置堆大小。
讓我們開始創建一個與應用程序jar
文件同名且擴展名為.conf
spring-boot-runtime-2.conf
。
我們現在可以將其放置在資源下的文件夾中,並將堆配置添加到JAVA_OPTS
:
JAVA_OPTS="-Xms512m -Xmx1024m"
接下來,我們將修改我們的Maven構建,以將spring-boot-runtime-2.conf
文件jar
文件target
文件夾中:
<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>com.baeldung.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
jar
文件並傳入JVM參數。
最後,我們通過設置來研究一種可能的生產級別解決方案。 conf
文件旁邊的胖子jar
並創建一個System V初始化服務來運行我們的應用程序。
還有其他解決方案可用於從Spring Boot胖子中創建服務和守護程序jar,
其中許多解決方案提供了覆蓋JVM參數的特定方法。