11

Spring Boot项目优化和JVM调优

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng%3D%3D&%3Bmid=2650860883&%3Bidx=1&%3Bsn=41e082ea4fb508f7be88e1466ce4929e
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

zaqquan.jpg!web

https://www.cnblogs.com/jpfss/p/9753215.html

项目调优

作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在 Spring Boot 项目中,调优主要通过配置文件和配置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 # 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.

2. JVM 调优

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

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

3. JVM调优实战

3.1 未设置JVM参数的情况

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

YNz2maV.jpg!web

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

BfquQ3I.jpg!web

3.2 下面我们来设置下 JVM 参数

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

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

方式一

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

yq6VfiN.jpg!web

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

q63Azqa.jpg!web

堆栈分配:

baQfQnv.jpg!web

方式二

适用于在项目部署后,在启动的时候,采用脚本或者命令行运行的时候设置。 先在项目路 径下给项目打包, 清理旧项目:

$ mvn clean

IFJfYf3.jpg!web

打包新项目:

打包新项目:

$ mvn package -Dmaven.test.skip=true
打包完成后进入可运行 jar 包的路径下:

VniUZvQ.jpg!web

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

Zn26rqv.jpg!web

关于这些设置的 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 (元空间最大大小)

JDK8 开始把类的元数据放到本地化的堆内存( native heap )中,这一块区域就叫Metaspace, 中文名叫元空间。

使用本地化内存有什么好处呢?

最直接的表现就是 java.lang.OutOfMemoryError: PermGen 空间问题将不复存在。 因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上 Metaspace 就可以有多大 ,这解决了空间不足的问题 (貌似容量还与操作系统的虚拟内存有关? 这里不太清楚)

不过,让 Metaspace 变得无限大显然是不现实的,因此我们也要限制 Metaspace 的大小: 使用 -XX:MaxMetaspaceSize 参数来指定 Metaspace 区域的大小。 JVM 默认在运行时根据需要动态地设置 MaxMetaspaceSize 的大小。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK