啟動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參數的特定方法。