https://www.cnblogs.com/jpfss/p/9753215.html项目调优作为工程师,项目调优是必须掌握的东西。在SpringBoot项目中,调优主要是通过JVM的配置文件和参数来完成的。1.修改配置文件关于修改配置文件application.properties,推荐《Spring Boot 项目详细的配置文件修改文档》https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#common-application-properties比较重要的有:server.tomcat.max-connections=0#Maximumnumberofconnectionsthattheserveracceptsandprocessesatanygiventime.server.tomcat.max-http-header-size=0#Maximumsize,inbytes,oftheHTTPmessageheader.server.tomcat.max-http-post-size=0#Maximumsize,inbytes,oftheHTTPpostcontent.server.tomcat.max-threads=0#Maximumnumberofworkerthreads.server.tomcat.min-spare-threads=0#Minimumnumberofworkerthreads.2.JVM调优Oracle官网有JVM调优指南说明,有兴趣的可以去看看。《Oracle 官网对 JVM 调优的说明》https://docs.oracle.com/middleware/11119/wls/PERFM/jvm_tuning.htm#i11460603。JVM调优实践3.1没有设置JVM参数的情况现在有一个项目,默认没有设置JVM参数。让我现在开始吧。查看堆栈分配。默认的最大堆内存分配是8G,这显然是不合理的。3.2接下来,我们来设置JVM参数。比如配置这么大一段的JVM参数:-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=128m-Xms1024m-Xmx1024m-Xmn256m-Xss256k-XX:SurvivorRatio=8-XX:+UseConcMarkSweepGC方法1.如果使用使用IDEA等开发工具启动并运行项目,之后调试JDK就方便多了。只需将参数值设置为VMOptions。设置成功,我的GC日志和堆栈分配都正常。GClog:Stackallocation:方法二适合在项目部署后、启动时、脚本或命令行运行时设置。先将项目打包到项目路径下,清理旧项目:$mvnclean打包新项目:$mvnpackage-Dmaven.test.skip=true打包完成后,进入可执行jar包路径:执行启动和设置JVM参数的操作:$java-jar-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=128m-Xms1024m-Xmx1024m-Xmn256m-Xss256k-XX:SurvivorRatio=8-XX:+UseConcMarkSweepGCnewframe-1.0.0.jar这个时候再看看监控,你会发现是可以的。堆栈根据启动时设置的JVM参数启动。这些设置的JVM参数的含义可以参考Oracle官方给出的调优文档。这里简单说一下:-XX:MetaspaceSize=128m(元空间的默认大小)-XX:MaxMetaspaceSize=128m(元空间的最大大小)-Xms1024m(堆的默认大小)-Xmx1024m(堆的最大大小)-Xmn256m(新generationSize)-Xss256k(最大栈深度大小)-XX:SurvivorRatio=8(新生代分区比例8:2)-XX:+UseConcMarkSweepGC(指定使用的垃圾收集器,这里使用CMS收集器)-XX:+PrintGCDetails(打印详细的GC日志)JDK8知识点后,-XX:PermSize和-XX:MaxPermGen被去掉,取而代之的是:-XX:MetaspaceSize=128m(元空间的默认大小)-XX:MaxMetaspaceSize=128m(最大元空间大小)JDK8开始将类的元数据放入本地化堆内存(本机堆)。这个区域叫做元空间,中文叫元空间。使用局部内存有什么好处?最直接的表现就是java.lang.OutOfMemoryError:PermGenspace问题将不复存在。因为默认类的元数据分配只受本地内存大小的限制,也就是说本地内存剩下多少,Metaspace理论上就可以有多大,解决了空间不足的问题(好像容量也跟操作系统的虚拟内存有关?这里不太清楚)。但是,让Metaspace无限大显然是不现实的,所以我们还得限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。默认情况下,JVM在运行时根据需要动态设置MaxMetaspaceSize的大小。好吧,祝大家学习和工作顺利!
