减少Spring boot启动内存(开发环境)

在学习cloud的过程中,因为启动了多个服务,发现电脑(8G内存)卡成狗啦。。。。
看下图:
在这里插入图片描述
想到每个服务都只是简单的使用了cloud的功能,内存怎么会这么大呢?
头疼 扒拉扒拉一大堆文章后 大佬们给出了建议

  1. 修改tomcat的启动线程数
    参考: https://blog.csdn.net/wy674396380/article/details/80527530
    在这里插入图片描述

  2. 修改jvm大小
    参考: https://dzone.com/articles/spring-boot-memory-performance
    https://blog.csdn.net/wanhuiguizong/article/details/79289986
    https://blog.csdn.net/wd2014610/article/details/82182617

修改之后cpu和内存立马降下来了
在这里插入图片描述

一、修改配置文件

关于修改配置文件application.properties
SpringBoot项目详细的配置文件修改文档

其中比较重要的有:

server.tomcat.max-connections=0 # Maximum number of connections that the server accepts and processes at any given time.
server.tomcat.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header.
server.tomcat.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content.
server.tomcat.max-threads=0 # Maximum number of worker threads.
server.tomcat.min-spare-threads=0 # Minimum number of worker threads.
 
 

二、Jvm调优

关于Jvm调优Oracle官网有一份指导说明:
Oracle官网对Jvm调优的说明
有兴趣大家可以去看看。

三、Jvm调优实战

1、未设置JVM参数的情况

我现在有一个项目,默认情况下,没有设置任何Jvm参数。
下面我来启动看一下。

这里写图片描述

看一下堆栈分配:
很明显默认的最大堆内存分配了8个G。很明显的不合理嘛。

这里写图片描述

2、下面我们来设置下Jvm参数

例如要配置JVM这么一大段参数:

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC
 
 

方式一:
如果你用的是IDEA等开发工具,来启动运行项目,那么要调试JDK就方便太多了。
只需要将参数值设置到VM options中即可。

这里写图片描述

设置成功,我的GC日志和堆栈分配都已经OK了。

GC日志:

这里写图片描述

堆栈分配:

这里写图片描述

方式二:
适用于在项目部署后,在启动的时候,采用脚本或者命令行运行的时候设置。

先在项目路径下,给项目打包:
清理就项目

mvn clean
 
 

这里写图片描述

打包新项目:

 mvn package -Dmaven.test.skip=true
  
  
  • 1

打包完成后进入可运行Jar包的路径下:

这里写图片描述

执行启动设置Jvm参数的操作。

$ java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC newframe-1.0.0.jar
  
  

这个时候,你再看监控,你就会发现,已经是Ok的了。
堆栈都是按照启动时候,设置的Jvm参数启动的。

这里写图片描述

关于这些设置的JVM参数是什么意思,请参考第二步中的oracle官方给出的调优文档。

我在这边简单说一下:

-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
-Xms1024m (堆最大大小)
-Xmx1024m (堆默认大小)
-Xmn256m (新生代大小)
-Xss256k (棧最大深度大小)
-XX:SurvivorRatio=8 (新生代分区比例 8:2)
-XX:+UseConcMarkSweepGC (指定使用的垃圾收集器,这里使用CMS收集器)
-XX:+PrintGCDetails (打印详细的GC日志)

知识点:

JDK8之后把-XX:PermSize 和 -XX:MaxPermGen移除了,取而代之的是
-XX:MetaspaceSize=128m (元空间默认大小)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
使用本地化的内存有什么好处呢?最直接的表现就是java.lang.OutOfMemoryError: PermGen 空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。不过,让Metaspace变得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。

问题:

在开发spring cloud过程中一个很严重的资源问题就是内存占用过高,而实际上本机开发测试并没有很大的请求量,所以这是对电脑资源的一种严重的浪费,甚至导致IDE卡死、崩溃。

一个完整包含eureka,steam,sleuth,config,rabbit,oauth2等一些列spring cloud全家桶应用和其他业务相关组件组成的单个服务在12G内存电脑上启动占用的内存就达到1到1.5G。如果同时需要启动很多个服务,内存完全不够用。

解决方法:

修改IDE针对每个项目的jvm参数。

这里以idea为例:

1.  打开Edit Configurations

Idea右上角,如图:

 

2.参考如下配置:

左边如果是spring cloud 的话肯定是在spring boot下,如果没有,可以点击左上角的+号手动添加,一般启动过的项目这里会有的。

关于jvm参数后面会讲。

这里要注意的是,register项目不需要太多资源(我这里设置128M),Gateway和config服务可以比register多一点(256M)。其它业务性服务才需要更多的资源(512M)。

请根据自己电脑配置情况调整,我的电脑是12G内存。

2.  关于jvm配置

参考1http://blog.csdn.net/sdujava2011/article/details/50086933有如下描述

1. 设置JVM内存的参数有四个:

 -Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

 -Xms   Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

 -Xmn   Java Heap Young区大小,不熟悉最好保留默认值;

 -Xss   每个线程的Stack大小,不熟悉最好保留默认值;

 参考2: https://www.cnblogs.com/w-wfy/p/6415856.html有如下描述:

一般用到最多的是

 -Xms512m  设置JVM促使内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

 -Xmx512m ,设置JVM最大可用内存为512M。

 -Xmn200m:设置年轻代大小为200M。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

 -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

效果

效果很明显

12G内存启动了14个服务和其他各种软件(idea 3个),内存占用如下图:

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 是一个基于 Spring 框架的快速应用开发框架,它的主要特点和优点有: - 快速构建项目:可以通过 Spring Initializr 快速构建 Spring Boot 项目,并且可以通过 Maven 或 Gradle 自动配置和下载依赖。 - 简化配置:Spring Boot 可以通过自动配置来简化 Spring 项目的配置,可以减少很多样板代码的编写。 - 嵌入式容器:Spring Boot 可以直接运行在嵌入式容器中,而不需要部署到外部容器,方便开发和测试。 - 可执行的 JAR 文件:Spring Boot 可以将项目打包为可执行的 JAR 文件,方便在生产环境中部署。 - Actuator:Spring Boot 提供了一个 Actuator 功能,可以帮助监控和管理应用程序,包括应用程序的健康状态、内存使用情况等。 总的来说,Spring Boot 可以帮助开发人员快速构建和部署项目,并且提供了很多实用的功能,使得开发和维护项目变得更加方便。 ### 回答2: Spring Boot是一个开源的Java框架,主要用于快速构建独立的、可运行的、生产级别的Spring应用程序。其特点和优点如下: 1. 简化配置:Spring Boot使用“约定优于配置”的原则,提供了默认配置,减少开发人员在配置方面的工作量。它通过自动配置和启动器的方式,简化了配置文件的编写和管理。 2. 内嵌服务器:Spring Boot内置了Tomcat、Jetty等Web服务器,无需手动部署应用程序,可以直接运行在内嵌的服务器上。这种方式大大简化了部署和运行的复杂性,提高了开发效率。 3. 微服务架构支持:Spring Boot提供了大量与微服务相关的功能和工具,如服务发现、负载均衡、断路器等。开发人员可以方便地使用这些功能来构建基于微服务架构的应用程序。 4. 自动装配:Spring Boot通过自动扫描类路径,并根据依赖自动装配相应的Bean,大大减少了手动配置的工作。开发人员只需专注于业务逻辑的编写,而无需关心繁琐的配置。 5. 大量的起步依赖:Spring Boot提供了丰富的起步依赖,可快速集成各种常用的开发框架和技术。这些起步依赖可以减少依赖的冲突和版本管理的复杂性,使得开发人员能够更快地搭建起一个完整的应用程序。 6. 监控和管理:Spring Boot集成了Actuator模块,提供了丰富的端点来监控和管理应用程序。通过Actuator可以获取应用程序的运行时状态、健康状况、性能指标等信息,方便开发人员进行应用程序的监控和管理。 总之,Spring Boot以其简洁、快速、高效的特点,大大提高了开发效率和部署效率,是现代Java应用程序开发的首选框架之一。 ### 回答3: Spring Boot 是一个开源的Java开发框架,其特点和优点如下: 1. 简化配置:Spring Boot 提供了自动配置的功能,可以根据项目的依赖自动配置相关的组件,大大减少了配置的工作量和复杂度。 2. 内嵌容器:Spring Boot 默认使用内嵌的Web容器(如Tomcat、Jetty等),可以使得项目打包成一个可执行的JAR文件,方便部署和运行。 3. 快速开发Spring Boot 提供了大量的开发工具和默认的配置,可以快速搭建和开发项目,提高开发效率。 4. 微服务支持:Spring Boot 支持构建微服务架构,可以快速创建和部署微服务应用,满足了现代化的分布式系统开发需求。 5. 高度集成:Spring Boot 整合了丰富的第三方库和框架,如Spring Data、Spring Security等,可以方便地实现数据访问、安全性等功能。 6. 自动化测试:Spring Boot 提供了测试的支持,可以快速编写单元测试和集成测试,保证项目的质量。 7. 监控和管理:Spring Boot 提供了健康监控、性能监控和配置管理等功能,可以方便地管理和监控项目的运行状态。 8. 生态系统:Spring Boot 作为Spring家族的一员,可以充分利用Spring生态系统的各种扩展和插件,提供更强大的功能和灵活性。 总而言之,Spring Boot 的特点是简化配置、快速开发、高度集成和微服务支持,其优点是提高开发效率、降低配置复杂度、方便部署和管理,适用于各种规模的Java项目开发
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值