当前位置:首页 > Java技术 > SpringBoot 和JVM 调优(深度好文,建议收藏)

SpringBoot 和JVM 调优(深度好文,建议收藏)

2022年11月08日 08:40:27Java技术12

点击上方[全栈开发者社区]右上角[...][设为星标⭐]

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

项目调优

作为一名工程师,项目调优这事,是必须得熟练掌握的事情。


在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。

一、修改配置文件

关于修改配置文件 application.properties。


SpringBoot项目详细的配置文件修改文档

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#common-application-properties

其中比较重要的有:

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调优的说明

https://docs.oracle.com/middleware/11119/wls/PERFM/jvm_tuning.htm#i1146060

有兴趣大家可以去看看。

三、Jvm调优实战

1、未设置JVM参数的情况

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


下面我来启动看一下。

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

看一下堆栈分配:


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

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

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

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

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

方式一:


如果你用的是IDEA等开发工具,来启动运行项目,那么要调试JDK就方便太多了。


只需要将参数值设置到 VM options中即可。

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

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

GC日志:

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

堆栈分配:

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

方式二:


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

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


清理就项目

mvn clean

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

打包新项目:

mvn package-Dmaven.test.skip=true

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

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

执行启动设置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参数启动的。

SpringBoot 和JVM 调优(深度好文,建议收藏) _ JavaClub全栈架构师技术笔记

关于这些设置的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的大小。

好啦,祝大家学习和工作顺利啦!

作者:星朝

cnblogs.com/jpfss/p/9753215.html

---END---
觉得本文对你有帮助?请分享给更多人
关注「全栈开发者社区」加星标,提升全栈技能本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。好文章,我在看❤️

作者:全栈开发者社区
来源链接:https://blog.csdn.net/weixin_35681869/article/details/106866199

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68445.html

分享给朋友:

“SpringBoot 和JVM 调优(深度好文,建议收藏)” 的相关文章

SpringBoot项目改为SpringCloud项目使用nacos作为注册中心

SpringBoot项目改为SpringCloud项目使用nacos作为注册中心

本章讲解的是在不改变原有业务的情况下将springboot改为springcloud项目使用nacos作为注册中心 首先在官网下载好nacos注册中心,在bin目录中startup.cmd文件为启动命令默认端口号是8888 接下来修改原有项目依赖...

前后端分离,SpringBoot如何实现验证码操作

前后端分离,SpringBoot如何实现验证码操作

验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot是如何提供服务的。SpringBoot版本本文基于的Spring Boot的版本是2.6.7 。引入依赖captcha一款超简单的验证码生成,还挺好玩的.还有中文验证码,动态验证码...

SpringBoot整合MybatisPlus基本的增删改查,保姆级教程

SpringBoot整合MybatisPlus基本的增删改查,保姆级教程

概述MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动,这里介绍了基本的整合SpringBoot和基础用法。引入依赖在项目中pom文件引入mybatisplus和mysql驱动依赖,如下图   &nb...

Spring Boot 2.0 WebFlux 快速入门实践

Spring Boot 2.0 WebFlux 快速入门实践

02:WebFlux 快速入门实践 Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot (Boot 顾名思义,是...

SpringCloud实战|8.SpringCloud 整合 seata1.3

SpringCloud实战|8.SpringCloud 整合 seata1.3

手把手教你从0开始搭建spring cloud alibaba 脚手架,关注公众号“AI码师” 获取项目完整源码 前言 本篇文章介绍了如何在Spring Cloud项目中引入seata,以及seata的安装过程 开整...

WebFlux 集成 Thymeleaf 、 Mongodb 实践,Spring Boot 2

WebFlux 集成 Thymeleaf 、 Mongodb 实践,Spring Boot 2

这是泥瓦匠的第105篇原创 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-5-thymeleaf-mong...

Spring Boot 集成配置 HTTPS

Spring Boot 集成配置 HTTPS

这是泥瓦匠的第108篇原创 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 1.5.9.RELEASE 一、HTTPS 是什么 问:什么是HTTP?答:HTTP是一个客户...

Spring Boot 中如何使用 Dubbo Activate 扩展点

Spring Boot 中如何使用 Dubbo Activate 扩展点

摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 公司的核心竞争力在于创新 – 《启示录》 』 继续上一篇:《 Springboot 整合 Dubbo/ZooKeeper 》,在...

[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口

[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1、介绍RESTful架构风格 2、Sprin...

springboot集成activiti工作流时容易出现的问题

No.1 启动报错 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.activiti.spring.boot.SecurityAutoCo...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。