jvisualvm安装Visual GC插件以及连接远程应用监控jvm【杭州多测师_王sir】【杭州多测师】
一)jvisualvm工具安装Visual GC插件
1、在本地jdk安装路径找到jvisualvm.exe双击打开
2、选择工具-插件-勾选visual GC
如果显示重试,先点击设置-编辑-选择你本地对应的JDK版本的URL:https://visualvm.github.io/pluginscenters.html
3、点击远程-添加远程主机-选择jstat方式连接-填写远程服务器的IP地址-填写端口为1003
二、在服务器上面进行配置
1、首先找到jdk的安装路径,输入下面的命令进行寻找
ls -lrt /usr/bin/java
cd /etc/alternatives/java
我的jdk安装路径就是:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/bin
2、然后在jdk的bin目录下创建文件:vim jstatd-all.policy 文件内容如下:
grant codebase "file:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/lib/tools.jar" { permission java.security.AllPermission; };
3、然后创建一个vim j-start-jstatd.sh 文件,里面内容如下:
###########启动 jstatd############## echo "Hi,即将启动 jstatd 请稍等..." echo "" echo "" echo -e "\033[31m<<<<< 正在为您启动:jstatd 请稍候!!!>>>>>\033[0m" echo "" ps -ef|grep jstatd.all.policy |grep -v grep | awk '{print $2}'| xargs -i kill -9 {} cd /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/bin ./jstatd -J-Djava.security.policy=jstatd.all.policy -p 10003 -J-Djava.rmi.server.hostname=150.158.xxx.xxx -J-Djava.rmi.server.logCalls=true
4、通过./j-start-jstatd.sh命令启动之后显示如下,表示启动成功
FINER: RMI TCP Connection(5)-113.215.180.xxx: [113.215.180.xxx: sun.tools.jstatd.RemoteVmImpl[-4a24c792:1865478c9f9:-7ff8, 7334292608518085183]: public abstract byte[] sun.jvmstat.monitor.remote.RemoteVm.getBytes() throws java.rmi.RemoteException]
5、通过netstat -nltp命令显示如下
6、然后通过在本地启动jmeter进行负载或者压测
7、然后就可以看到jvisualVM里面关于JVM的一些监控了
8、可以用top命令监控到压测的进程信息
9、然后通过dstat -tcmnd --disk-util命令去查看CPU和内存使用情况等等(没有dstat命令先安装一下:yum install sysstat)
10、然后通过jstat -gcutil 28937 1 20命令去看看是否有youngGC和fullGC
11、如果要查看堆栈信息可以用jstack + 进程号命令
12、如果要查看 jvm 的内存分配用jmap -heap 28937命令
这个图可以看出:
MaxHeapSize = 2051014656 (1956.0MB)最大堆内存 1.9G
MaxNewSize = 683671552 (652.0MB) 最大新生代内存 652m
OldSize = 87031808 (83.0MB) 老年代内存 83m
MetaspaceSize = 21807104 (20.796875MB) 元空间内存才20M
NewRatio = 2 表示新生代:老年代=1:2
SurvivorRatio = 8 表示 eden:Survivor=8:1
13、然后需设置jvm参数的话、进入到Tomcat中的bin目录下vim catalina.sh 文件
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:NewRatio=2 -XX:SurvivorRatio=8"
设置堆内存:-Xms1024m -Xmx1024m
设置新生代内存:-XX:NewSize=256m -XX:MaxNewSize=256m
设置新生代和老年代的比例:-XX:NewRatio=2
设置伊甸园和 Survivor 的比例:-XX:SurvivorRatio=8
设置栈内存:-Xss1m
每个线程都会产生一个栈。在相同物理内存下,减小这个值能生成更多的线程。如果这个值太小会影响方法调用的深度
设置最大持久代大内存:-XX:MaxPermSize=256m(jdk1.8 之后取消了持久代,改成了元空间)
设置新生代代对象进入老年代的年龄:-XX:MaxTenuringThreshold=16
设置新生代 gc 最大年龄。如果设置为 0 的话,则新生代对象直接进入老年代
设置对象直接进入老年代的内存阈值:-XX:PretenureSizeThreshold=1024
对象大小大于 1024 字节的直接在老年代分配对象
14、JVM参数调优相关参数
-server:tomcat 以 server 模式运行时将拥有更大更高的并发处理能力,更快更强捷的 JVM 垃圾回收机制,可以获得更多的负载与吞吐量
-Xms–Xmx:把 Xms 与 Xmx 两个值设成一样是最优的做法
-Xss:设定线程的堆栈大小。一般不易设置超过 1M,否则容易出现 out ofmemory
-XX:+AggressiveOpts:启用这个参数,则每当 JDK 版本升级时,你的 JVM 都会使用最新加入的优化技术
-XX:+UseBiasedLocking:启用一个优化了的线程锁。使得 appserver 内对线程处理自动进行最优调配
-XX:PermSize=128M-XX:MaxPermSize=256M:设置非堆内存初始值
-XX:+DisableExplicitGC:在程序代码中不允许调用 System.gc()
-XX:+UseParNewGC:对年轻代采用多线程并行回收
-XX:+UseConcMarkSweepGC:使用 cms GC 回收器
-XX:MaxTenuringThreshold:设置年轻代 gc 最大年龄
-XX:+CMSParallelRemarkEnabled:在使用 UseParNewGC 的情况下, 尽量减少 mark 的时间(暂时不理解)
-XX:+UseCMSCompactAtFullCollection:使用 concurrent_gc 的情况下,防止 memoryfragmention,对 live _object 进行整理,减少 memory 碎片
-XX:LargePageSizeInBytes:指定 Java heap 的分页页面大小
-XX:+UseFastAccessorMethods:get,set 方法转成本地代码
-XX:+UseCMSInitiatingOccupancyOnly:指示只有在 oldgeneration 使用了初始化的比例后 concurrent collector 启动收集
-XX:MaxGCPauseMillis=500设置年轻代回收的最长时间
-XX:ParallelGCThreads=4 设置并行回收的线程数
-XX:+UseParallelOldGC:对老年代采用多线程并行回收
-XX:+UseAdaptiveSizePolicy:并行收集器会自动选择年轻代区大小和相应的 Survivor 区比例
-XX:NativeMemoryTracking=detail追踪 JVM 的内部内存使用,开启之后会增加 5%-10% 的性能消耗
jvm 调优示例
Linux 下 tomcat 启动参数
export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
Windows 下 tomcat 启动参数
set JAVA_OPTS=-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true
15、Tomcat线程池调优
maxSpareThreads:的意思就是如果空闲状态的线程数多于设置的数目,则将这些线程中止,减少这个池中的线程总数
minSpareThreads:最小备用线程数,tomcat 启动时的初始化的线程数
connectionTimeout:网络连接超时时间毫秒数
maxThreads:这个值表示 Tomcat 可创建的最大的线程数,即最大并发数
acceptCount:线程数达到 maxThreads 后,后续请求会被放入一个等待队列,acceptCount 是这个队列的大小,如果这个队列满了,就直接 refuse connection
maxProcessors 与 minProcessors:多线程使 CPU 利用率最大,空闲时间保持最低,从而接受更多的请求。通常 Windows1000 左右,Linux2000 左右
线程池调优示例:
<connector port="8080" protocol="HTTP/1.1" <="" p="" style="word-wrap: break-word;"> URIEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443" />
配置Tomcat线程池的路径:(配置之前先可以备份一下server.xml以防止配失败导致启动不了Tomcat)
vim /data/apache-tomcat-7.0.56/conf/server.xml