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

 

 

posted @ 2023-02-15 17:55  多测师_王sir  阅读(795)  评论(0编辑  收藏  举报