作为一名工程师,项目调优是必须要熟练掌握的。在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#服务器在任何给定时间接受和处理的最大连接数.server.tomcat.max-http-header-size=0#HTTPmessageheader.server.tomcat.max-http-post-size=0#的最大大小,以字节为单位Maximumsize,inbytes,oftheHTTPpostcontent.server.tomcat.max-threads=0#Maximumnumberofworkerthreads.server.tomcat.min-spare-threads=0#Minimumnumberofworkerthreads.JvmtuningOracle官网有关于Jvm调优的指南:https://docs.oracle.com/middleware/11119/wls/PERFM/jvm_tuning.htm#i1146060有兴趣的可以去看看。Jvm调优实践一、JVM参数未设置的情况。我现在有一个项目。默认情况下,没有设置Jvm参数。让我现在开始吧。看栈分配:很明显默认的最大堆内存分配是8G,显然不合理。2.接下来,让我们设置Jvm参数。比如配置这么大一段的JVM参数:-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=128m-Xms1024m-Xmx1024m-Xmn256m-Xss256k-XX:SurvivorRatio=8-XX:+UseConcMarkSweepGC方法一:如果使用使用IDEA等开发工具启动并运行项目,之后调试JDK就方便多了。只需将参数值设置为VM选项。设置成功,我的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这个时候你看看监控,你会发现已经OK了。栈根据启动时设置的Jvm参数启动。这些设置的JVM参数的含义请参考第二步oracle官方给出的调优文档。这里简单介绍一下:-XX:MetaspaceSize=128m(元空间的默认大小)-XX:MaxMetaspaceSize=128m(元空间的最大大小)-Xms1024m(堆的最大大小)-Xmx1024m(默认大小oftheheap)-Xmn256m(新生代的大小)-Xss256k(最大栈深度大小)-XX:SurvivorRatio=8(新生代分区比例8:2)-XX:+UseConcMarkSweepGC(指定使用的垃圾收集器,这里使用CMS收集器)-XX:+PrintGCDetails(打印详细的GC日志)知识点:JDK8后去掉了-XX:PermSize和-XX:MaxPermGen,取而代之的是-XX:MetaspaceSize=128m(元空间的默认大小)-XX:MaxMetaspaceSize=128m(元空间的最大大小)JDK8开始将类的元数据放入本地化堆内存(nativeheap)。这个区域叫做元空间,中文叫元空间。使用局部内存有什么好处?最直接的表现就是java.lang.OutOfMemoryError:PermGenspace问题将不再存在,因为默认类的元数据分配只受本地内存大小的限制,也就是说剩余的本地内存量可以理论上和Metaspace一样大(好像容量也跟操作系统的虚拟内存有关?这里不清楚),解决了空间不足的问题。但是,让Metaspace无限大显然是不现实的,所以我们还得限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。默认情况下,JVM在运行时根据需要动态设置MaxMetaspaceSize的大小。
