项目调优

作为一名工程师,项目调优这事,是必须得熟练掌握的事情。
在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应用性能监测工具。它可以做到:

  1. 显示虚拟机进程以及进程的配置,环境信息
  2. 监视应用程序的CPU,GC,堆,方法区以及线程的信息
  3. dump以及分析堆转储快照
  4. 方法级的程序运行性能分析,找出调用最多,运行时间最长的方法
  5. 离线程序快照:收集程序的运行时配置,纯种dump,内存dump等信息建立一个快照,可以将快照发送给开发者进行Bug反馈
  6. 其他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连接)相关推荐

  1. SpringBoot 项目构建 Docker 镜像调优实践

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:超级小豆丁 http://www.mydlq.club/article/16/ PS ...

  2. JVM 调优实战--VisualVM综合分析可视化工具的使用教程(含远程JMX连接)

    目录 VisualVM工具的使用 启动VisualVM 概览 查看本地进程 查看CPU.内存.类.线程运行信息 查看线程详细信息 抽样器 监控远程的JVM 什么是JMX 监控远程的tomcat 使用V ...

  3. JVM调优系列:(五)JVM常用调试参数和工具

    转自:http://blog.csdn.net/opensure/article/details/46715769 JVM常用调试参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 ...

  4. JVM调优系列:(二)JVM运行时数据区域

    1) Method Area 2) Heap 3) Java Stacks 4) PC Registers 5) Native Method Stacks JAVA的JVM的内存模型大致可分为3个区: ...

  5. JVM 调优实战--jvisualvm远程连接使用教程

    jvisualvm远程连接 使用Java自带的jvisualvm调试Java程序,可以查看CPU.内存.类及线程等信息,还可以进行Dump,无疑是一个利器 由于客户端是Windows.服务端是Linu ...

  6. SpringBoot项目优化和Jvm调优(亲测,真实有效)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:星朝 原文:cnblogs.com/jpfss/p/9753 ...

  7. java项目processes设置,Jvm调优和SpringBoot项目优化的详细教程

    参考文章 1.先看一下未设置JVM参数的情况,默认情况下,没有设置任何Jvm参数. 2.设置Jvm参数. 配置参数: 关于这些设置的JVM参数是什么意思,参考Jvm调优. -XX:MetaspaceS ...

  8. SpringBoot项目优化和Jvm调优(楼主亲测,真实有效)

    今日推荐Spring新版本抛弃JVM,可独立部署,网友:要自立门户???国内大神成功给手机装上了 Win11,代码已开源!Fluent Mybatis 牛逼!Nginx 常用配置清单这玩意比Threa ...

  9. springboot不会运行gc_SpringBoot项目深度优化和Jvm调优

    点击上方"Java学习之道",选择"关注"公众号 每天上班,干货准时送达! 本文作者:星朝 本文来源:www.cnblogs.com/jpfss/p/97532 ...

最新文章

  1. java 实现图片上传功能
  2. 使用python完成的一个烟花小程序-厉害了,我用Python写了一个自动回复拜年信息的小程序!...
  3. 调用API的SDK相关知识:实现回调函数.
  4. Algorithms_基础数据结构(01)_线性表之数组数组的应用案例分析
  5. 深入探索并发编程之内存屏障:资源控制操作
  6. 高级数据分析师凭什么月薪三万?一文解答你所有困惑
  7. vue require动态路径图片报错_Vue 动态生成路由结构
  8. noip2012-day2-t2
  9. Hibernate查询缓存
  10. C#中用委托实现C++的回调函数
  11. vim之添加多行和删除多行
  12. User-Defined-Literal自定义字面量
  13. 115网盘 最好的网盘 雨林木风出品 强烈推荐
  14. 数据库中多对多的关系设计
  15. iPad协议 一键转发 群发消息 获取群二维码 清理僵尸粉V:viplac
  16. 大型高端OA协同办公系统源码分享
  17. 构建自己的Aleax查询服务
  18. 不使用设备管理器卸载外设驱动的方法(转)
  19. 金融经济学期末梳理(王江)第七章 风险厌恶程度度量
  20. c语言释放malloc空间,C语言内存分配与释放

热门文章

  1. 10.14 将n个数按输入输出顺序的逆序排列,用函数实现
  2. 缓存和字符串相互转换
  3. (学)咱们换一种说法!
  4. k均值算法原理详细讲解以及matlab代码实现
  5. 卡尔曼滤波MATLAB代码实现
  6. Python学习笔记:类
  7. CPU指令集是什么东西
  8. getopt的用法与optarg
  9. 制作Python的安装模块
  10. kafka消费的三种模式_快速认识Kafka