【问题标题】:How can i decrease Spring Boot application memory usage in Docker?如何减少 Docker 中的 Spring Boot 应用程序内存使用量?
【发布时间】:2019-12-07 19:59:22
【问题描述】:

我有一个问题,为什么非常简单的 Spring Boot 应用程序分配 100 MB RAM ?如何减少内存使用量?

1) https://start.spring.io/ 生成带有“Spring Web Starter”依赖的演示项目

2) Dockerfile

FROM openjdk:8-jre-alpine
ADD /target/demo.jar demo.jar
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /demo.jar"]

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0   http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
    <java.version>1.8</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
    <finalName>demo</finalName>
</build>

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/app")
public class AppRestController {
    @GetMapping(value = "/test")
    public ResponseEntity<String> health() {
        return new ResponseEntity<>("test OK!", HttpStatus.OK);
    }
}

1) 内存测试 1

docker build -f Dockerfile -t 演示。

docker run -p 8080:8080 演示

码头工人统计

内存使用/限制
101.5MiB / 989.4MiB

2) 使用 JVM 键的内存测试 2

码头工人停止 dc9305c42d09

docker run -p 8080:8080 -e JAVA_OPTS="-Xmx50M -Xms50M" 演示

码头工人统计

内存使用/限制 107.2MiB / 989.4MiB

内存使用相同。我怎样才能减少它?

【问题讨论】:

标签: java docker dockerfile


【解决方案1】:

您需要传递诸如 -m 50m 之类的内容来限制容器的可用内存以及用于 JVM 的 -Xmx 和 Xms。

下面的文章解释得很好。

JVM Memory Allocation in Docker Container

【讨论】:

  • 感谢您的回答这是工作示例: docker run -m 75MB -p 8080:8080 -e JAVA_OPTS="-Xmx30M -Xms30M" demo 但是,如果我设置 -m 小于 75 MB,例如 50MB,应用程序无法启动
  • Spring MVC 至少需要 75 到 100 MB,包括堆和非堆。 Xms 仅用于堆。类存储在元空间中。更多详情可以在spring.io/blog/2015/12/10/spring-boot-memory-performance找到
猜你喜欢
  • 2017-11-13
  • 2010-10-02
  • 1970-01-01
  • 2010-09-28
  • 2020-12-24
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多