在总体应用架构中,非生产环境状况下,通常 1GB 或者 2GB 的 RAM 就足够了。若是咱们将这个应用程序划分为 20 或 30 个独立的微服务,那么很难指望 RAM 仍将保持在 1GB 或 2GB 左右。特别是若是咱们使用 Spring Cloud 的时候。java
首先,准备三个服务,Eureka 服务 + 提供 REST API 的两个简单的微服务,并将微服务注册到 Eureka。此处,不以任何方式限制这些应用程序的内存使用。spring
提示:Spring Cloud 简单应用的搭建示例: https://www.ictgu.cn/share/66...
就像你在下图看到的同样,三个微服务大概占用了电脑 1.5GB 的 RAM 内存。这三个服务是最简单的应用程序,基本没有数据处理量,对于这样的内存消耗量,显然是不理想的。RAM 的最低使用量是用于 Eureka
发现服务,最大的用于初始化声明式客户端以调用其余服务的 API。服务器
关于内存使用量以下图 JProfiler 制做的图表。如图所示,内存使用受堆影响,与非堆相比,它占用了大量空间。架构
固然,第一个明显的问题是咱们是否须要在堆上运行咱们的微服务应用程序的空间。答案是否认的,咱们没有。如今,咱们来简要介绍一下在
Java 8 中如何进行内存管理过程。spring-boot
咱们能够将JVM内存分为两个不一样的部分:堆(Heap)、 非堆(Non-Heap)。如上图所示,咱们的微服务器的大小为大小(〜600MB)。反过来,JVM 内存 由 年轻代(Young Generation) 、老年代(Old Generation)组成。全部新建立的对象都位于年轻代中。当年轻代被填满时,执行次要垃圾收集(Minor GC)。更准确的说,这些位于年轻代的一部分对象成为 Eden Space。Minor GC将全部仍然使用的对象从 Eden Space 移动到 Survivor 0。对于Survivor 0 和 Survivor 1 空间执行相同的过程。在 GC 的许多循环中幸存的全部对象都被移动到老年代内存空间。从哪里移除对象是由 Major GC 负责的。为了更好地了解下图,在运行 java -jar 命令时,可使用如下参数设置 Java Heap 的内存限制:微服务
JVM内存的第二部分,从咱们的角度来看,上图略显不重要,它是Non-Heap。 Non-Heap 包括如下部分:测试
更简单来讲,Heap 是用于对象,Non-Heap 是用于类。能够想像,当咱们的应用程序 Non-Heap 大于 Heap 时,咱们能够结束这种状况。首先,让咱们用下面的参数来运行咱们的服务发现。在我看来,若是您在 Spring Boot 上启动具备内嵌 Tomcat 的 Eureka,这些配置是最低的值。spa
-Xms16m \ -Xmx32m \ -XX:MaxMetaspaceSize=48m \ -XX:CompressedClassSpaceSize=8m \ -Xss256k \ -Xmn8m \ -XX:InitialCodeCacheSize=4m \ -XX:ReservedCodeCacheSize=8m \ -XX:MaxDirectMemorySize=16m
若是使用REST API 的微服务(带有 Feign 或 Ribbon),咱们须要增长一些值:线程
-Xms16m \ -Xmx48m \ -XX:MaxMetaspaceSize=64m \ -XX:CompressedClassSpaceSize=8m \ -Xss256k \ -Xmn8m \ -XX:InitialCodeCacheSize=4m \ -XX:ReservedCodeCacheSize=8m \ -XX:MaxDirectMemorySize=16m
按照如上配置,JProfiler 生成了以下图表。区别在于启动和请求处理时间。与早期的设置相比,该应用程序的运行速度较慢。固然,我不会在生产环境下设置这样的参数。3d
当前的总内存使用状况以下。微服务仍然是内存占用最大的,而Eureka 最小。
我也尝试使用不一样的 Web 容器运行 Eureka 应用程序。您能够经过在pom.xml
文件中包含如下的依赖关系轻松更改 Web 容器。
使用 Undertow
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
使用 Jetty
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
结果排名:Undertow(116MB)、Tomcat(122MB)、Jetty(128MB)。
此测试仅针对 Eureka 服务执行,而无需注册任何微服务。
Java 资料大全 连接:https://pan.baidu.com/s/1pUCC... 密码:b2xc
更多资料: 2020 年 精选阿里 Java、架构、微服务精选资料等,加 v ❤ :qwerdd111
本文由博客一文多发平台 OpenWrite 发布!