Spring Boot 和 Spring Cloud 应用内存如何管理?
Spring Boot 和 Spring Cloud 应用内存如何管理?
在整体应用架构中,非生产环境情况下,一般 1GB 或者 2GB 的 RAM 就足够了。如果我们将这个应用程序划分为 20 或 30 个独立的微服务,那么很难期望 RAM 仍将保持在 1GB 或 2GB 左右。特别是如果我们使用 Spring Cloud 的时候。
首先,准备三个服务,Eureka 服务 + 提供 REST API 的两个简单的微服务,并将微服务注册到 Eureka。此处,不以任何方式限制这些应用程序的内存使用。
提示:Spring Cloud 简单应用的搭建示例:https://www.ictgu.cn/share/6644e468
就像你在下图看到的一样,三个微服务大概占用了电脑 1.5GB 的 RAM 内存。这三个服务是最简单的应用程序,基本没有数据处理量,对于这样的内存消耗量,显然是不理想的。RAM 的最低使用量是用于 Eureka
发现服务,最大的用于初始化声明式客户端以调用其他服务的 API。
关于内存使用量如下图 JProfiler 制作的图表。如图所示,内存使用受堆影响,与非堆相比,它占用了大量空间。
当然,第一个明显的问题是我们是否需要在堆上运行我们的微服务应用程序的空间。答案是否定的,我们没有。现在,我们来简要介绍一下在
Java 8 中如何进行内存管理过程。
我们可以将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 的内存限制:
-Xms – JVM启动时的初始堆大小
-Xmx – 最大堆大小
-Xmn - 年轻代的大小,其余的空间是老年代
JVM内存的第二部分,从我们的角度来看,上图略显不重要,它是Non-Heap。 Non-Heap 包括以下部分:
Thread Stacks :所有运行的线程的空间。可以使用 -Xss 参数设置最大线程大小。
Metaspace : 它替代了 PermGem(Java 7中是JVM堆的一部分)。在 Metaspace 中,通过应用程序加载所有类和方法。看看Spring Cloud 包含的包数量,我们不会在这里节省大量的内存。可以通过设置 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 参数来管理 Metaspace 大小。
Code Cache : 这是由 JIT(即时)编译器编译为本地代码的本机代码(如JNI)或 Java 方法的空间。最大大小设置 -XX:ReservedCodeCacheSize 参数。
Compressed Class Space : 使用 -XX:CompressedClassSpaceSize 设置为压缩类空间保留的最大内存。
Direct NIO Buffers
更简单来说,Heap 是用于对象,Non-Heap 是用于类。可以想像,当我们的应用程序 Non-Heap 大于 Heap 时,我们可以结束这种情况。首先,让我们用下面的参数来运行我们的服务发现。在我看来,如果您在 Spring Boot 上启动具有内嵌 Tomcat 的 Eureka,这些配置是最低的值。
-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 生成了如下图表。区别在于启动和请求处理时间。与早期的设置相比,该应用程序的运行速度较慢。当然,我不会在生产环境下设置这样的参数。
当前的总内存使用情况如下。微服务仍然是内存占用最大的,而Eureka 最小。
我也尝试使用不同的 Web 容器运行 Eureka 应用程序。您可以通过在pom.xml 文件中包含以下的依赖关系轻松更改 Web 容器。
使用 Undertow
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId>
使用 Jetty
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId>
结果排名:Undertow(116MB)、Tomcat(122MB)、Jetty(128MB)。
此测试仅针对 Eureka 服务执行,而无需注册任何微服务。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花 前言今年主要会做一个比较完整的微服务项目开源出来。目前已经开始了,刚兴趣的先Star一个吧。 项目:https://github.com/yinjihuan/kitty-cloud 基础框架:https://github.com/yinjihuan/kitty 在做的过程中遇到一个问题那就是标题所说的两个框架碰撞了火花。都是S开头的谁都不服谁。 问题描述既然使用了Sentinel来限流,那么干脆熔断也直接用Sentinel好了,所以就没使用Hystrix了。 Sentinel对Feign做了适配,使用的时候只需要引入spring-cloud-starter-alibaba-sentinel,如下: <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> 然后在配置文件打开 Sen...
- 下一篇
SAP Commerce(原Hybris)的一些架构图,持续更新
版本号:v1.00 2020年4月13日 @TOC 模块图 layer chart 类型 类型继承 At the bottom is the Service layer, which includes fine-grained(细粒的; 精准的) business methods, such as the ones responsible for adding promotions to a cart, or for calculating the total value of the cart. These services expose the data model, which persists in the database. On top of the Service layer, there are facades, which implement specific business use-cases, such as adding a product to a cart, placing an order, or searching for a product. The...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境