spring boot maven plugin - jvm arguments - 直接内存大小设置
spring boot maven plugin - jvm arguments - direct memory size setting
我正在使用 spring-boot-maven-plugin 通过以下命令从我的应用构建一个 docker 图像:
spring-boot::build-image
我需要用这个 jvm 参数更改 jvm 直接内存的默认大小(默认为 10m):
-XX:MaxDirectMemorySize=64M
这是我在 pom.xml
应用程序中拼命尝试的尝试,我尝试了我想到的一切:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<jvmArguments>-XX:MaxDirectMemorySize=64M</jvmArguments>
<environmentVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</environmentVariables>
<systemPropertyVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
<image>
<name>docker.io/example/${project.artifactId}:${project.version}</name>
</image>
<excludeDevtools>true</excludeDevtools>
<systemPropertyVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</systemPropertyVariables>
<environmentVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</environmentVariables>
<jvmArguments>-XX:MaxDirectMemorySize=64M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005</jvmArguments>
</configuration>
</plugin>
但是直接内存仍然设置为10M :(
当应用程序启动时,我可以在日志文件中看到它:
Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_bellsoft-liberica/java-security-properties/java-security.properties -agentpath:/layers/paketo-buildpacks_bellsoft-liberica/jvmkill/jvmkill-1.16.0-RELEASE.so=printHeapHistogram=1 -XX:ActiveProcessorCount=8 -XX:MaxDirectMemorySize=10M -Xmx11521920K -XX:MaxMetaspaceSize=144375K -XX:ReservedCodeCacheSize=240M -Xss1M -Dorg.springframework.cloud.bindings.boot.enable=true
任何人都可以告诉我我做错了什么吗?
备注:
Spring 开机:2.3.7.RELEASE
当我 运行 docker 使用 -e
手动图像时,jvm 参数的更改正在工作:
docker run -e JAVA_TOOL_OPTIONS=-XX:MaxDirectMemorySize=64M docker.io/example/app-name:0.0.1
这个 mvn 插件正在使用 Buildpack 创建 docker 图像:
https://paketo.io/docs/buildpacks/language-family-buildpacks/java/#about-the-jvm
更新:
根据文档,这应该是可行的解决方案,但它不是:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
<image>
<name>docker.io/example/${project.artifactId}:${project.version}</name>
<env>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
</env>
</image>
</configuration>
这取决于你在这里的目标。听起来您想在应用程序运行时更改容器中的最大直接内存,因此您应该只执行您在此处指示的工作(以及文档中列出的内容)。
docker run -e JAVA_TOOL_OPTIONS=-XX:MaxDirectMemorySize=64M docker.io/example/app-name:0.0.1
您引用的文档 link 正在谈论在 运行时 配置选项,这就是您对 env 变量所做的。
这是一个关于如何使运行时环境具有“粘性”的工作解决方案:
....
<image>
<name>docker.io/example/${project.artifactId}:${project.version}</name>
<env>
<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</BPE_APPEND_JAVA_TOOL_OPTIONS>
<BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
</env>
</image>
...
spring-boot-maven-plugin 正在使用 paketo buildpacks:
文档:
https://github.com/paketo-buildpacks/environment-variables
对于在 Mac + Spring Boot 构建映像上使用 Docker 的任何人,请注意在 [=25= 上写入 Docker 的默认设置] 是一个 2GB 的 VM 映像,在 linux VM 中运行 Linux 和 Docker 运行。
使用当前的 Spring 2.3.X 默认 Pareto 生成器,这会生成一个 docker 图像,它有大约 300MB 的可用空间,但是一个相当简单的 spring 应用程序根据内存计算器,(对我来说)需要 ~600MB。
所以无论 maxDirectMemorySize
的值是多少,它都是行不通的。一旦我提高了 docker VM 可用的内存,它就可以正常工作
我正在使用 spring-boot-maven-plugin 通过以下命令从我的应用构建一个 docker 图像:
spring-boot::build-image
我需要用这个 jvm 参数更改 jvm 直接内存的默认大小(默认为 10m):
-XX:MaxDirectMemorySize=64M
这是我在 pom.xml
应用程序中拼命尝试的尝试,我尝试了我想到的一切:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<jvmArguments>-XX:MaxDirectMemorySize=64M</jvmArguments>
<environmentVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</environmentVariables>
<systemPropertyVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
<image>
<name>docker.io/example/${project.artifactId}:${project.version}</name>
</image>
<excludeDevtools>true</excludeDevtools>
<systemPropertyVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</systemPropertyVariables>
<environmentVariables>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
<JAVA_OPTS>-XX:MaxDirectMemorySize=64M</JAVA_OPTS>
</environmentVariables>
<jvmArguments>-XX:MaxDirectMemorySize=64M -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005</jvmArguments>
</configuration>
</plugin>
但是直接内存仍然设置为10M :( 当应用程序启动时,我可以在日志文件中看到它:
Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_bellsoft-liberica/java-security-properties/java-security.properties -agentpath:/layers/paketo-buildpacks_bellsoft-liberica/jvmkill/jvmkill-1.16.0-RELEASE.so=printHeapHistogram=1 -XX:ActiveProcessorCount=8 -XX:MaxDirectMemorySize=10M -Xmx11521920K -XX:MaxMetaspaceSize=144375K -XX:ReservedCodeCacheSize=240M -Xss1M -Dorg.springframework.cloud.bindings.boot.enable=true
任何人都可以告诉我我做错了什么吗?
备注:
Spring 开机:2.3.7.RELEASE
当我 运行 docker 使用 -e
手动图像时,jvm 参数的更改正在工作:
docker run -e JAVA_TOOL_OPTIONS=-XX:MaxDirectMemorySize=64M docker.io/example/app-name:0.0.1
这个 mvn 插件正在使用 Buildpack 创建 docker 图像:
https://paketo.io/docs/buildpacks/language-family-buildpacks/java/#about-the-jvm
更新:
根据文档,这应该是可行的解决方案,但它不是:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
<image>
<name>docker.io/example/${project.artifactId}:${project.version}</name>
<env>
<JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</JAVA_TOOL_OPTIONS>
</env>
</image>
</configuration>
这取决于你在这里的目标。听起来您想在应用程序运行时更改容器中的最大直接内存,因此您应该只执行您在此处指示的工作(以及文档中列出的内容)。
docker run -e JAVA_TOOL_OPTIONS=-XX:MaxDirectMemorySize=64M docker.io/example/app-name:0.0.1
您引用的文档 link 正在谈论在 运行时 配置选项,这就是您对 env 变量所做的。
这是一个关于如何使运行时环境具有“粘性”的工作解决方案:
....
<image>
<name>docker.io/example/${project.artifactId}:${project.version}</name>
<env>
<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=64M</BPE_APPEND_JAVA_TOOL_OPTIONS>
<BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
</env>
</image>
...
spring-boot-maven-plugin 正在使用 paketo buildpacks:
文档: https://github.com/paketo-buildpacks/environment-variables
对于在 Mac + Spring Boot 构建映像上使用 Docker 的任何人,请注意在 [=25= 上写入 Docker 的默认设置] 是一个 2GB 的 VM 映像,在 linux VM 中运行 Linux 和 Docker 运行。
使用当前的 Spring 2.3.X 默认 Pareto 生成器,这会生成一个 docker 图像,它有大约 300MB 的可用空间,但是一个相当简单的 spring 应用程序根据内存计算器,(对我来说)需要 ~600MB。
所以无论 maxDirectMemorySize
的值是多少,它都是行不通的。一旦我提高了 docker VM 可用的内存,它就可以正常工作