Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring boot微服务在docker swarm中消耗大量内存_Java_Spring Boot_Java 8_Microservices_Docker Swarm - Fatal编程技术网

Java Spring boot微服务在docker swarm中消耗大量内存

Java Spring boot微服务在docker swarm中消耗大量内存,java,spring-boot,java-8,microservices,docker-swarm,Java,Spring Boot,Java 8,Microservices,Docker Swarm,我有一些docker swarm容器在Azure上的Ubuntu 16.04.4 LTS实例上运行。这些容器运行Java Spring Boot和Netflix OSS应用程序,如Eureka、Ribbon、Gateway等应用程序。我发现我的容器占用了巨大的内存,尽管服务只是REST端点 我试图通过如下传递JavaVM参数来限制内存消耗,但这并没有起到任何作用,即使在以后也没有改变大小 请注意我在这里使用的以下配置 Java版本:Java8 内核版本:4.15.0-1023-azure 操作系

我有一些docker swarm容器在Azure上的Ubuntu 16.04.4 LTS实例上运行。这些容器运行Java Spring Boot和Netflix OSS应用程序,如Eureka、Ribbon、Gateway等应用程序。我发现我的容器占用了巨大的内存,尽管服务只是REST端点

我试图通过如下传递JavaVM参数来限制内存消耗,但这并没有起到任何作用,即使在以后也没有改变大小

请注意我在这里使用的以下配置

Java版本:Java8

内核版本:4.15.0-1023-azure

操作系统:Ubuntu 16.04.4 LTS

OSType:linux

架构:x86_64

CPU:32

总内存:125.9GiB

docker统计数据之后的内存占用

Java虚拟机参数

docker service create --name xxxxxx-service --replicas 1 --network overnet 127.0.0.1:5000/xxxxxx-service --env JAVA_OPTS="-Xms16m -Xmx32m -XX:MaxMetaspaceSize=48m -XX:CompressedClassSpaceSize=8m -Xss256k -Xmn8m -XX:InitialCodeCacheSize=4m -XX:ReservedCodeCacheSize=8m -XX:MaxDirectMemorySize=16m -XX:+UseCGroupMemoryLimitForHeap -XX:-ShrinkHeapInSteps -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=70"
我还尝试查看了每个容器中的应用程序日志文件,但没有发现任何与内存相关的错误。我还试图限制容器资源。但这对我也不起作用


有什么线索可以帮助我解决这个严重的内存问题吗?

您可以使用visualvm或jprofiler之类的探查器来解决这个问题,它们会告诉您内存的分配位置(对象的类型等)


不过,如果可能的话,您不应该在生产系统上使用它,因为评测可能会占用大量CPU。

另一种了解我过去使用过的更多信息的方法是添加特殊代码,将内存信息添加到日志文件中。 这也会减慢你的系统速度,但是当你的方面写得很好的时候,不要使用一个概要文件


如果可能的话,更倾向于分析-如果不是的话,AspectJ加载时间编织可能会有所帮助。

您可以尝试启用执行器,并将内存消耗值与docker stats生成的值进行比较

要启用执行器,可以在pom.xml文件中添加以下依赖项

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
通过这种方式,您可以监视应用程序的内存性能,并找出应用程序实际消耗的内存量。如果这与docker生成的报告类似,那么这就是代码的问题


然而,我必须声明,致动器的使用不利于生产,因为它本身有大量的资源开销

谢谢你的评论,但正如我前面提到的,这些都是基本的REST端点,如果我在本地运行它,只需要150到200 MBs就可以了。但是,只有当我部署到Docker容器时,这个问题才会出现。请建议。我已经用visualvm检查过了,但是如果我在本地运行它,它不会占用超过200 MB的空间。但是,只有当您将它部署到Docker上时,问题才会出现,它会增长到大约5-6GB的完整内存分配
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-rest-hal-browser</artifactId>
</dependency>
{
    "mem" : 193024,
    "mem.free" : 87693,
    "processors" : 4,
    "instance.uptime" : 305027,
    "uptime" : 307077,
    "systemload.average" : 0.11,
    "heap.committed" : 193024,
    "heap.init" : 124928,
    "heap.used" : 105330,
    "heap" : 1764352,
    "threads.peak" : 22,
    "threads.daemon" : 19,
    "threads" : 22,
    "classes" : 5819,
    "classes.loaded" : 5819,
    "classes.unloaded" : 0,
    "gc.ps_scavenge.count" : 7,
    "gc.ps_scavenge.time" : 54,
    "gc.ps_marksweep.count" : 1,
    "gc.ps_marksweep.time" : 44,
    "httpsessions.max" : -1,
    "httpsessions.active" : 0,
    "counter.status.200.root" : 1,
    "gauge.response.root" : 37.0
}