首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何解决用于构建spring引导应用程序的内存问题?

如何解决用于构建spring引导应用程序的内存问题?
EN

Stack Overflow用户
提问于 2021-05-18 13:04:46
回答 1查看 3.8K关注 0票数 5

我正在使用部署到AWS BeanStalk的spring maven-plugin构建Docker映像。但是,当容器启动时,我会看到下面的错误。我在构建包方面有点新,但是我尝试通过使用网站上描述的buildpack变量来解决这个问题。但它对下面的错误日志中显示的值没有任何影响。我找到了这个github问题,但不确定它是否相关,以及如何使用它。

我正在使用具有1G总RAM的AWS微实例,它执行滚动更新,因此在启动新映像时,另一个也在运行,直到新映像成功启动为止,因此启动容器也可能只有300 so可用,但是,在正常运行期间,它更可用。

为什么我需要这个内存计算?我就不能把它关掉吗?当我构建app.jar的Docker映像并将其部署到aws豆茎时,它在没有任何内存设置的情况下工作得很好:

码头修造。-build_FILE=./target/app.jar -t $APPLICATION_NAME

但是我想通过spring maven插件使用映像构建。请给我一些如何解决这个问题的建议?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <image>
                    <name>${image.name}</name>
                    <env>
                        <tag>${project.version}</tag>
                        <!--BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:MaxDirectMemorySize=1M</BPE_APPEND_JAVA_TOOL_OPTIONS-->
                        <BPE_JAVA_TOOL_OPTIONS>-Xms1024m -Xmx3048m</BPE_JAVA_TOOL_OPTIONS>
                    </env>
                </image>
            </configuration>
        </plugin>

部署过程中的AWS Bean秸秆错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Tue May 18 2021 18:07:14 GMT+0000 (UTC)   INFO   Successfully built aws_beanstalk/staging-app
Tue May 18 2021 18:07:22 GMT+0000 (UTC)   ERROR   Docker container quit unexpectedly after launch: 0M, -Xss1M * 250 threads
[31;1mERROR: [0mfailed to launch: exec.d: failed to execute exec.d file at path '/layers/paketo-buildpacks_bellsoft-liberica/helper/exec.d/memory-calculator': exit status 1. Check snapshot logs for details.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   [Instance: i-0dc33dcb517e89ef9] Command failed on instance. Return code: 1 Output: (TRUNCATED)...pectedly after launch: 0M, -Xss1M * 250 threads
[31;1mERROR: [0mfailed to launch: exec.d: failed to execute exec.d file at path '/layers/paketo-buildpacks_bellsoft-liberica/helper/exec.d/memory-calculator': exit status 1. Check snapshot logs for details. 
Hook /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   INFO   Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   Unsuccessful command execution on instance id(s) 'i-0dc33dcb517e89ef9'. Aborting the operation.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   Failed to deploy application.
Tue May 18 2021 18:07:24 GMT+0000 (UTC)   ERROR   During an aborted deployment, some instances may have deployed the new application version. To ensure all instances are running the same version, re-deploy the appropriate application version.
##[error]Error: Error deploy application version to Elastic Beanstalk

在AWS Bean秸秆中下载的Docker错误日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Docker container quit unexpectedly on Tue May 18 18:07:21 UTC 2021:
Setting Active Processor Count to 1
Calculating JVM memory based on 274300K available memory
unable to calculate memory configuration
fixed memory regions require 662096K which is greater than 274300K available for allocation: -XX:MaxDirectMemorySize=10M, -XX:MaxMetaspaceSize=150096K, -XX:ReservedCodeCacheSize=240M, -Xss1M * 250 threads
[31;1mERROR: [0mfailed to launch: exec.d: failed to execute exec.d file at path '/layers/paketo-buildpacks_bellsoft-liberica/helper/exec.d/memory-calculator': exit status 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-18 17:58:53

好的,这就是这个告诉我们的:

基于274300K可用内存计算JVM内存

内存计算器正在检测容器中可用的最大内存量为274300 or,即大约274 or。

固定内存区域需要662096K,可用于分配的大于274300K:-XX:MaxDirectMemorySize=10M、-XX:MaxMetaspaceSize=150096K、-XX:ReservedCodeCacheSize=240M、-Xss1M *250个线程。

这条消息是说内存计算器在其当前配置中至少需要662096KB或662M。

它也在分解为什么它需要/想要这么多:

  • 10M直接存储器
  • 150096K用于metaspace
  • 240 m用于保留代码缓存
  • 线程250米(特别是线程堆栈)

这还不包括需要更多的堆(堆似乎至少需要1G )。

这就留下了两种可能性:

  1. 容器没有足够大的供给。你需要给它更多的记忆。
  2. 内存计算器无法正确检测内存限制。

如果你怀疑#2,请看以下内容。内存计算器通过按这个顺序查看这些位置来选择它的最大内存限制(即上面示例中的274米)。

  1. 通过查看容器内的/sys/fs/cgroup/memory/memory.limit_in_bytes,检查配置的容器内存限制。
  2. 再次从容器内部查看/proc/meminfoMemAvailable度量,检查系统的最大可用内存。
  3. 如果其他一切都失败了,它将以1G的失败告终。

如果它确实不像上面所描述的那样工作,那么请打开窃听器并提供尽可能多的细节。

或者,您可以调优内存计算器。您可以指示它向特定区域提供更少的内存,这样就可以减少所需的总内存,使其小于最大可用内存。

您可以通过在JAVA_TOOL_OPTIONS env变量中设置JVM内存标志来做到这一点(您有不正确的BPE_JAVA_TOOL_OPTIONS )。见https://paketo.io/docs/buildpacks/language-family-buildpacks/java/#runtime-jvm-configuration

例如,如果要覆盖堆大小,则在JAVA_TOOL_OPTIONS中将JAVA_TOOL_OPTIONS设置为自定义。内存计算器将查看您设置的内容,并相应地调整其余的内存设置。尽可能多的覆盖。

要想把东西装进内存274米以内,你就得走得很小。有点像-Xss256K -XX:ReservedCodeCacheSize=64M -XX:MaxMetaspaceSize=64 -Xmx64M。我没有测试来确认,但这显示了你需要做什么的想法。减少内存设置,使所有总和都符合容器的最大内存限制。

这也没有考虑到您的应用程序实际上是否能够在如此小的范围内运行。如果你太小,你可能会在某个时候看到OutOfMemoryErrors或StackOverflowErrors,你的应用程序就会崩溃。您还可以通过过多地减少代码缓存大小而对性能产生负面影响,因为这是JIT存储其优化为本机代码的字节代码的地方。如果堆的大小不合适,甚至会导致GC问题,或者由于GC太多而导致性能下降。总之,如果你要这样做的话,要非常小心。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67593945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文