JVM笔记(一)初识JDK调优相关命令及可视化监控工具

4 篇文章 0 订阅

目录

1. 相关命令

1.1 jps 

1.2 Jmap

1.3 Jstack

1.4 Jinfo

1.5 Jstat

2. jvisualvm

2.1 安装GC监控插件:Visual GC

2.2 监控远程linux服务器java应用

2.3 Visual GC界面初识

3. BTrace

4. Arthas


1. 相关命令

1.1 jps 

  • jps   #简单列出当前正在运行的虚拟机进程

  • jps -l      #列出进程,并输出类全名或jar包路径

  • jps -v    #列出进程,输出虚拟机启动是的JVM参数

 

1.2 Jmap

常用的是 -heap 查看堆信息,-histo当前堆内对象明细,-dump导出堆dump文件

  • jmap -heap 22796 #查看堆的总体信息,各个区域占用情况及配置信息

  • jmap -histo 14660 #查看历史生成的实例
  • jmap -histo:live 14660 #查看当前存活的实例,执行过程中会触发一次full gc
    • jmap -histo 14660 > d:/log.txt 输出到文件

  • jmap -dump:live,format=b,file=D:/test.dump 37056   #导出dump,只要存活的对象,可用jvisualvm分析dump对象

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=D:\jvm.dump

内存溢出时自动导出dump文件到指定路径

 

1.3 Jstack

生成java虚拟机当前时刻的线程快照

可以用来检测程序死锁,编写一死锁程序

 public static void main(String[] args) throws InterruptedException, IOException {
      final Object obj1 = new Object();
      final Object obj2 = new Object();
      new Thread(new Runnable() {
          @Override
          public void run() {
              synchronized (obj1) {
                  try {
                      // 睡一会保证死锁发生
                      TimeUnit.SECONDS.sleep(1);
                  } catch (InterruptedException e) {}

                  System.out.println("11111");
                  synchronized (obj2) {
                      System.out.println("22222");
                  }
              }
          }
      }).start();

      new Thread(new Runnable() {
          @Override
          public void run() {
              synchronized (obj2) {
                  try {
                      // 睡一会保证死锁发生
                      TimeUnit.SECONDS.sleep(1);
                  } catch (InterruptedException e) {}

                  System.out.println("333333");
                  synchronized (obj1) {
                      System.out.println("44444");
                  }
              }
          }
      }).start();

执行程序,成功锁住

1.4 Jinfo

主要用来查看jvm的各项参数,示例:

  • jinfo -flags pid #打印虚拟机参数

  • jinfo -flag 参数名 pid #查看某个参数是否启用

查看当前是否启用了G1收集器

1.5 Jstat

查看堆内存各部分的使用量,以及加载类的数量

jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]

  • jstat -gc pid 最常用,示例:jstat -gc 29688 2000 #查看pid29688的进程垃圾回收情况,2秒刷新一次

  • S0C:第一个幸存区的大小,单位KB
  • S1C:第二个幸存区的大小
  • S0U:第一个幸存区的使用大小
  • S1U:第二个幸存区的使用大小
  • EC:伊甸园区的大小
  • EU:伊甸园区的使用大小
  • OC:老年代大小
  • OU:老年代使用大小
  • MC:方法区大小(元空间)
  • MU:方法区使用大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:年轻代垃圾回收次数
  • YGCT:年轻代垃圾回收消耗时间,单位s
  • FGC:老年代垃圾回收次数
  • FGCT:老年代垃圾回收消耗时间,单位s
  • GCT:垃圾回收消耗总时间,单位s

还有其他选项,更有针对性的查看JVM情况,-class查看加载的class数量等,-gccapacity查看堆内存使用情况等。

通过查看内存垃圾回收频率和对象增长速率,调整堆大小,年轻代和老年代大小比例等来减少full GC次数。尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年 代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。

 

2. jvisualvm

JDK自带的分析工具,目录:$JAVA_HOME/bin下jvisualvm.exe

打开后界面如下,选择要监控的程序进程,能看到jvm参数、线程执行情况、CPU和堆内存使用情况等,如果需要查看运行时堆gc情况需要另外安装插件

划圈的是可以查看当前堆中的类的情况实例多少,占用内存多少等,亦可以导入dump文件分析

 

2.1 安装GC监控插件:Visual GC

安装步骤:

1、打开jvisualvm,工具--》插件--》可用插件,勾选Visual GC安装,若安装失 败,走2

2、进入visual VM官网  https://visualvm.github.io/pluginscenters.html

 

查找对应jdk版本的vm工具下载路径例如JDK7Update 6-25:https://visualvm.github.io/archive/uc/7u6/updates.xml.gz,复制到jvisualvm 工具--》插件--》设置

然后再打开可用插件,勾选Visual GC安装,若还是安装失败,走3

3、打开2中下载路径

下载Visual GC到本地,打开插件--》已下载,导入安装

 

2.2 监控远程linux服务器java应用

两步

一:打开远程linux服务器上的jstatd , jstatd用来监控jvm创建终止,并提供接口给外部监控工具

二:本地jvisualvm配置远程监控地址和端口

第一步:cd $JAVA_HOME/bin,进入jstatd工具目录,直接执行会报错,需要赋予权限

 

新建个jstatd.all.policy权限文件,在哪建都行,一般权限文件都在$JAVA_HOME/jre/lib/security/下,咱也建到这

vim jstatd.all.policy     输入下方代码,简单设置直接赋予所有权限

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

 之后再到$JAVA_HOME/bin目录下启动jstatd

 ./jstatd -J-Djava.security.policy=../jre/lib/security/jstatd.all.policy &

默认开启的监听端口为1099,可以加-p参数指定端口

./jstatd -J-Djava.security.policy=../jre/lib/security/jstatd.all.policy -p 9866 &

第二步:jvisualvm左边栏右键添加远程主机,配置服务器地址和第一步配置的端口,默认1099,配置好后若连接正常,主机下会出现远程服务器中监控到的jvm

 

2.3 Visual GC界面初识

Refresh rate设置刷新图表频率,从左向右看

Space

  1. Perm 监控的应用是JDK6的,所以是perm,1.8后就是metaspace
  2. Old 老年代
  3. Eden 年轻代的伊甸园区
  4. S0/S1 两个surviver区

Graphs

  1. Compile Time 编译时间,总编译数3550,累计时间29.582s,一次突起表示一次JIT编译
  2. Class Loader Time 类加载事件,总加载类18702个,101个卸载,花费时间1m 28.985s
  3. GC Time 垃圾回收次数992次,花费1m 12.348s, 最后一次gc原因不知,突起表示正在gc
  4. Eden Space 伊甸园区,最大容量1023.875M,当前容量210.821M,已经使用了113M,垃圾回收949次,耗费时间19s
  5. Surviver 0区 最大容量341M,当前容量61M,已使用0
  6. Surviver 1区 最大341M,当前63M,已使用1M
  7. Old Gen 老年代 最大1G,当前682M,已使用348M,垃圾回收43次,耗费52s
  8. Perm Gen 永久代 最大512M,当前256M,已使用169M

 

3. BTrace

原理类似我在类加载系统笔记中测试的HotSwap热加载示例,利用了java 1.6之后的VirtaulMachine技术,动态的attach到一个已启动的jvm上,为他去启动一个BtraceAgent,为我们在目标jvm上植入的btrace agent实现。主要是Instrumentation技术, asm字节码处理技术。帮助我们在不重启应用情况下,增加日志,获取应用的一切调用信息。

可以单独命令行使用,我用的是Jvisualvm插件BTrace

安装:https://visualvm.github.io/uc/8u131/updates.html 下载Btrace相关,打开jvisualvm导入插件即可,安装完成,右键进程--》trace application --》如下

 需要我们编写脚本来实现各种功能,官网上https://github.com/btraceio/btrace/tree/develop/btrace-dist/src/main/resources/samples有些许示例,可以学习参考,这里我只列出我测试过的,觉得很有用的一些示例。

测试代码是一个简单的rest请求

  • 输出调用堆栈

 

  • 方法打印入参和返回值

有缓冲区延迟所以加上println("=================================");一行

还可以打印方法耗时、定时执行任务、监控程序是否走到某某行代码等等,待研究  

 

4. Arthas

是阿里巴巴开源的 Java 诊断工具,待研究

JVM笔记(四)Arthas使用

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值