SpringBoot项目优化和Jvm调优及VisualVM远程连接监控JVM(JMX连接)
项目调优
作为一名工程师,项目调优这事,是必须得熟练掌握的事情。
在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。
在这边有一篇比较好的文章,推荐给大家!
SpringBoot项目配置Tomcat和JVM参数
一、修改配置文件
关于修改配置文件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
打包完成后进入可运行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 (元空间触发GC的阈值)
-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 (Metaspace扩容时触发FullGC的初始化阈值,也是最小的阈值)
-XX:MaxMetaspaceSize=128m (元空间最大大小)
JDK 8开始把类的元数据放到本地化的堆内存(native heap)中,这一块区域就叫Metaspace,中文名叫元空间。
使用本地化的内存有什么好处呢?最直接的表现就是java.lang.OutOfMemoryError: PermGen 空间问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。不过,让Metaspace变得无限大显然是不现实的,因此我们也要限制Metaspace的大小:使用-XX:MaxMetaspaceSize参数来指定Metaspace区域的大小。JVM默认在运行时根据需要动态地设置MaxMetaspaceSize的大小。
四、VisualVM远程连接监控JVM(JMX连接)
VisualVM是JDK自带的一款java应用性能监测工具。它可以做到:
- 显示虚拟机进程以及进程的配置,环境信息
- 监视应用程序的CPU,GC,堆,方法区以及线程的信息
- dump以及分析堆转储快照
- 方法级的程序运行性能分析,找出调用最多,运行时间最长的方法
- 离线程序快照:收集程序的运行时配置,纯种dump,内存dump等信息建立一个快照,可以将快照发送给开发者进行Bug反馈
- 其他pulgins的功能支持。。。
当我们的应用上线(一般都会布署在虚拟机上)后,有时需要对其进行性能分析,此时我们可以用本地的VisualVM远程连接虚拟机上的应用来达到查看监控JVM的目的
开始
我这里启动的是springboot应用,是以jar包形式启动的哦。
先看一下当前的主机地址是否和公网地址(外网访问的地址)一致
hostname -i
如果显示的地址不一致的话,请先在/etc/hosts文件里添加一行,例如
47.106.xxx.xxx wesker
然后再执行看看生效了没有
hostname wesker
hostname -i
加入启动参数
java \
#添加jmx远程支持start
-Djava.rmi.server.hostname=47.106.xxx.xxx \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=33306\
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
#添加jmx远程支持end
-jar web.jar
这里没有开户登陆鉴权和ssl连接,所以authenticate=false和ssl=false
VisualVM建立连接
在本地(windows)jdk目录下的bin目录里,打开jvisualvm.exe,右键“远程”添加主机名
然后添加JMX连接
输入ip:port直接点击确定完成连接
如果提示
无法使用 service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:33306/jmxrmi 连接到 xxx.xxx.xxx.xxx:33306
请把防火墙关一下
service iptables stop
因为除了JMX server指定的监听端口号外,JMXserver还会监听一到两个随机端口号,如果你不想关闭防火墙可以执行以下操作:
拿到当前监听的端口
netstat -tupln |grep 33306
查看监听的随机端口
#lsof 没有安装的话 安装一个 yum install lsof
lsof -i|grep 2516
把这几个端口配置到安全组规则去吧(很麻烦,每次都要设置,所以我直接关防火墙省事多了)
结束
看一下连接成功的界面吧
本文转自1
本文转自2
SpringBoot项目优化和Jvm调优及VisualVM远程连接监控JVM(JMX连接)相关推荐
- SpringBoot 项目构建 Docker 镜像调优实践
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:超级小豆丁 http://www.mydlq.club/article/16/ PS ...
- JVM 调优实战--VisualVM综合分析可视化工具的使用教程(含远程JMX连接)
目录 VisualVM工具的使用 启动VisualVM 概览 查看本地进程 查看CPU.内存.类.线程运行信息 查看线程详细信息 抽样器 监控远程的JVM 什么是JMX 监控远程的tomcat 使用V ...
- JVM调优系列:(五)JVM常用调试参数和工具
转自:http://blog.csdn.net/opensure/article/details/46715769 JVM常用调试参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 ...
- JVM调优系列:(二)JVM运行时数据区域
1) Method Area 2) Heap 3) Java Stacks 4) PC Registers 5) Native Method Stacks JAVA的JVM的内存模型大致可分为3个区: ...
- JVM 调优实战--jvisualvm远程连接使用教程
jvisualvm远程连接 使用Java自带的jvisualvm调试Java程序,可以查看CPU.内存.类及线程等信息,还可以进行Dump,无疑是一个利器 由于客户端是Windows.服务端是Linu ...
- SpringBoot项目优化和Jvm调优(亲测,真实有效)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:星朝 原文:cnblogs.com/jpfss/p/9753 ...
- java项目processes设置,Jvm调优和SpringBoot项目优化的详细教程
参考文章 1.先看一下未设置JVM参数的情况,默认情况下,没有设置任何Jvm参数. 2.设置Jvm参数. 配置参数: 关于这些设置的JVM参数是什么意思,参考Jvm调优. -XX:MetaspaceS ...
- SpringBoot项目优化和Jvm调优(楼主亲测,真实有效)
今日推荐Spring新版本抛弃JVM,可独立部署,网友:要自立门户???国内大神成功给手机装上了 Win11,代码已开源!Fluent Mybatis 牛逼!Nginx 常用配置清单这玩意比Threa ...
- springboot不会运行gc_SpringBoot项目深度优化和Jvm调优
点击上方"Java学习之道",选择"关注"公众号 每天上班,干货准时送达! 本文作者:星朝 本文来源:www.cnblogs.com/jpfss/p/97532 ...
最新文章
- java 实现图片上传功能
- 使用python完成的一个烟花小程序-厉害了,我用Python写了一个自动回复拜年信息的小程序!...
- 调用API的SDK相关知识:实现回调函数.
- Algorithms_基础数据结构(01)_线性表之数组数组的应用案例分析
- 深入探索并发编程之内存屏障:资源控制操作
- 高级数据分析师凭什么月薪三万?一文解答你所有困惑
- vue require动态路径图片报错_Vue 动态生成路由结构
- noip2012-day2-t2
- Hibernate查询缓存
- C#中用委托实现C++的回调函数
- vim之添加多行和删除多行
- User-Defined-Literal自定义字面量
- 115网盘 最好的网盘 雨林木风出品 强烈推荐
- 数据库中多对多的关系设计
- iPad协议 一键转发 群发消息 获取群二维码 清理僵尸粉V:viplac
- 大型高端OA协同办公系统源码分享
- 构建自己的Aleax查询服务
- 不使用设备管理器卸载外设驱动的方法(转)
- 金融经济学期末梳理(王江)第七章 风险厌恶程度度量
- c语言释放malloc空间,C语言内存分配与释放