Spring Cloud微服务的内存使用情况

我在AWS的中小型机器上运行了多个微服务(Spring云+ docker),最近我发现这些机器经常用尽,需要重新启动。 我正在调查这种权力丧失的原因,考虑可能的内存泄漏或实例/容器上的configuration错误。

我试图限制这些容器可以使用的内存量:

docker run -m 500M --memory-swap 500M -d my-service:latest 

此时,我的服务(使用spring-data-redis将单个端点写入Redis DB的标准Spring云服务)甚至没有启动。

增加内存到760M ,它的工作,但监控与docker我看到的最低是:

 CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS cd5f64aa371e 0.18% 606.9 MiB / 762.9 MiB 79.55% 102.4 MB / 99 MB 1.012 MB / 4.153 MB 60 

我添加了一些参数来限制JVM内存堆,但它似乎并没有减less太多:

 _JAVA_OPTIONS: "-Xms8m -Xss256k -Xmx512m" 

我在跑

  • spring云Brixton.M5
  • Spring Boot 1.3.2
  • Java 8(Oracle JVM)
  • docker
  • Spring数据Redis 1.7.1

有这样一个简单的服务使用这么多内存运行的原因吗? 有什么function我应该禁用,以改善?

我们已经用JVM本身的相似设置来调查了很多东西。 如果使用Java 8,快速保存一些内存的方法是使用以下选项:

 -Xms256m -Xmx512m -XX:-TieredCompilation -Xss256k -XX:+UseG1GC -XX:+UseStringDeduplication 

G1GC有很好的文档logging,UseStringDeduplication通过去除堆中的string存储(我们在JSON / XML Web服务types的环境中发现大约20%)来减less堆的使用,并且使用CodeCache(从70Mb降到10Mb),以及以约10%的启动时间为代价减less10%的Metaspace。

根据Spring的“ 安装Spring Boot应用程序”页面,您可以通过环境variables或具有JAVA_OPTSvariables的configuration文件自定义应用程序启动脚本。

例如: JAVA_OPTS = -Xmx64m