在整体应用架构中,非生产环境情况下,一般 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

<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/1pUCCPstPnlGDCljtBVUsXQ 密码:b2xc

更多资料: 2020 年 精选阿里 Java、架构、微服务精选资料等,加 v ❤ :qwerdd111

转载,请保留原文地址,谢谢 ~

Spring Boot 和 Spring Cloud 应用内存如何管理?的更多相关文章

  1. Nacos Config客户端与Spring Boot、Spring Cloud深度集成

    目录 Nacos与Spring Boot集成 @NacosPropertySource和@NacosValue com.alibaba.nacos.spring.core.env.NacosPrope ...

  2. Spring Boot,Spring Cloud,Eureka,Actuator,Spring Boot Admin,Stream,Hystrix

    Spring Boot,Spring Cloud,Eureka,Actuator,Spring Boot Admin,Stream,Hystrix 一.Spring Cloud 之 Eureka. 1 ...

  3. 一:Spring Boot、Spring Cloud

    上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇.其实我们在这条路上已经走了一年多,从16年初到现在. ...

  4. 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践

    由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ...

  5. Spring Cloud Alibaba与Spring Boot、Spring Cloud之间不得不说的版本关系

    这篇博文是临时增加出来的内容,主要是由于最近连载<Spring Cloud Alibaba基础教程>系列的时候,碰到读者咨询的大量问题中存在一个比较普遍的问题:版本的选择.其实这类问题,在 ...

  6. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

    项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...

  7. spring boot 与 spring cloud 关系

    公司使用spring cloud,所以稍微了解一下 看了一下spring官网对 spring boot 以及 spring cloud 的解释 Spring Boot Spring Boot make ...

  8. 基于Spring Boot和Spring Cloud实现微服务架构学习

    转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...

  9. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

  10. Spring Boot和Spring cloud

    微服务框架SpringBoot简单验证 首先摘录部分IBM网站部分内容对框架做一个简单说明 http://www.ibm.com/developerworks/cn/java/j-lo-spring- ...

随机推荐

  1. rbac权限+中间件 初识

    rbac权限+中间件 1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or ...

  2. ubuntu在github上传项目

    GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub. 作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户.随着越来 ...

  3. Android之MVC、MVP、MVVM

    本文将详细阐述以下MVC.MVP.MVVM三种理念的定义 MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个 基本部分:模型(Model ...

  4. 如何删除Python中文本文件的文件内容?

    在python中: open('file.txt', 'w').close() 或者,如果你已经打开了一个文件: f = open('file.txt', 'r+') f.truncate(0) # ...

  5. 数据库连接JOIN

    1,连接类型及差异 INNER JOIN:结果集只有配对成功的数据,即不包含左表或右表为空的情况: OUTER JOIN: LEFT JOIN:结果包含左表的所有记录,右表不能成功匹配的显示NULL ...

  6. idea打包或编译错误,错误为c盘idea路径某些文件被占用(非idea文件,项目生成的文件)

    方法列表(2的效果可能更好) 1.将被占用的文件删除之后,重新打包或编译. 2.多编译几次项目. 3.发现真正可能的原因.(貌似被南航企业版360拦截了,导致targe或maven等文件被占用问题) ...

  7. 使用 Visual Studio 开发、测试和部署 Azure Functions(二)测试,部署

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  8. Linux 脏数据回刷参数与调优

    简介 我们知道,Linux用cache/buffer缓存数据,且有个回刷任务在适当时候把脏数据回刷到存储介质中.什么是适当的时候?换句话说,什么时候触发回刷?是脏数据达到多少阈值还是定时触发,或者两者 ...

  9. memcached-tool 工具

    perl memcached-tool server_ip:port stats 输出说明: pid memcache服务器的进程ID uptime 服务器已经运行的秒数 time 服务器当前的uni ...

  10. 1046 Shortest Distance (20分)

    The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed t ...