>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 16909 个阅读者 刷新本主题
 * 贴子主题:  JDK自带JVM调优工具的用法 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-11-24 08:50:05     消息  查看  搜索  好友  邮件  复制  引用

  
           本文介绍JDK自带的JVM调优工具。这些工具都在jdk的bin目录下。

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

    如何使用jinfo工具点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  jinfo显示虚拟机配置信息,我们通过jinfo --help能看到相应的参数:

     点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

option说明
  no option   输出全部的参数和系统属性

-flag  name  输出对应名称的参数

-flag [+|-]name  开启或者关闭对应名称的参数

-flag name=value  设定对应名称的参数

-flags  输出全部的参数

  -sysprops  输出系统属性
我们可以先使用 jps找到 pid。

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  jinfo pid会输出一堆相关信息

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  jinfo -flags pid

用来输出 JVM的全部参数

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  jinfo -flag name pid

使用该命令,可以查看指定的name为  JVM参数的值。

如:查看当前  JVM进程是否开启打印· GC日志。

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

同样的可以使用

  jinfo -flag [+|-]name pid

来开启或者关闭对应名称的参数 。

也可以使用

  jinfo -sysprops pid

来输出当前  JVM进行的全部的系统属性

    如何使用jmap工具点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  jmap(Java Memory Map) 命令,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap以生成  java程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及  finalizer 队列。

  jmap命令可以获得运行中的 JVM的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。可以使用jmap生成Heap Dump。

Memory = direct memory(直接内存) + JVM memory(MaxPermSize +Xmx);

  jmap --help打印辅助信息

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

option说明
   pid:java进程id,命令 ps -ef | grep java获取,或者 jps工具获取

executable:产生核心dump的 java可执行文件

core:需要打印配置信息的核心文件

remote-hostname-or-ip:远程调试的主机名或ip

server-id:可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器

-dump:format=b,file=使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.

-finalizerinfo 打印正等候回收的对象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.

  -histo[:live]打印每个class的实例数目,内存占用,类全名信息.  JVM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.

  -clstats(取代了在 JDK8之前打印类加载器信息的 permstat)打印 classload和 jvm heap长久层的信息. 包含每个 classloader的名字,活泼性,地址,父 classloader和加载的class数量。
使用命名查看 JVM的heap信息

  jmap -heap pid

输出Java堆详细信息 ;

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

使用

  jmap -histo:live pid

输出堆中对象的相关统计信息。
  第一列是序号,

第二列是对象个数,

第三列是对象大小byte,

第四列是class name
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

使用

  jmap -finalizerinfo pid

输出等待终结的对象信息

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

也可以使用

  jmap -clstats pid

来输出类加载器信息 。

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

    如何使用jstack工具点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  jstack命令最大的作用就是用来生成thread dump文件,thread dump文件中记录了某一时刻CPU信息 。
   jstack主要用于生成 java虚拟机当前时刻的线程快照。线程快照是当前 java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,

如线程间死锁、死循环、请求外部资源导致的长时间等待等。

线程出现停顿的时候通过 jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果现在运行的 java程序呈现hung的状态, jstack是非常有用的。
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

option书面
  -F:当正常输出的请求不被响应时,强制输出线程堆栈。
-l:除堆栈外,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况  
-m:如果调用到本地方法的话,可以显示C/C++的堆栈
  jstack pid

jstack命令会打印出所有的线程,包括用户自己启动的线程和 JVM后台线程,我们主要关注的是用户线程;

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

       1 "http-nio-8080-exec-8"  #26 daemon prio=5 os_prio=0 tid=0x000000005b940000 nid=0x1e2c waiting on condition [0x000000005c0be000] java.lang.Thread.State: WAITING (parking)
   http-nio-8080-exec-8:线程名称

daemon 表示线程是否是守护线程

prio 表示我们为线程设置的优先级

os_prio 表示的对应的操作系统线程的优先级,由于并不是所有的操作系统都支持线程优先级,所以可能会出现都置为0的情况

tid 是java中为这个线程的id

nid 是这个线程对应的操作系统本地线程id,每一个java线程都有一个对应的操作系统线程

wait on condition表示当前线程处于等待状态,但是并没列出具体原因

java.lang.Thread.StatC:\Users\Administrator\Desktop\ WAITING (parking) 也是表示的处于等待状态,括号中的内容说明了导致等待的原因,例如这里的parking说明是因为调用了 LockSupport.park方法导致等待
常用命令

   1 # 查询进程的线程信息 输出到jstatck_13324文件中
2jstack  13324 > jstatck_13324
3 # 十进制转换为十六进制
4 printf  "%x
"  21742

    如何使用jhat工具点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  JVM Heap Analysis Tool命令是与 jmap搭配使用,用来分析 jmap生成的dump, jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。

常用方式

   1#分析  dump 文件
2 jhat  -J-Xmx512M  dump .phrof
3
4#对比  dump 文件
5 jhat  -baseline  dump2 .phrof  dump1 .phrof

代码案例

   1 public   class  JhatTest {
2      public  static  void  main (String[] args) {
3         while( true) {
4            String string =  new String( "老田");
5            System.out.println(string);
6        }
7    }
8}

运行,使用 jps获取进程 pid

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

再使用 jmap -dump:format=b,file=heapDump pid

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

再到对应heapDump的包目录下执行

  jhat heapDump

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

然后可以通过访问

http://localhost:7000/

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

一般查看堆异常情况主要看这个两个部分:

  Show instance counts for all classes (excluding platform),平台外的所有对象信息。如下图:

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

  Show heap histogram  以树状图形式展示堆情况

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

具体问题排查的时候,需要结合代码,然后观察是否大量应该被回收的对象在一直被引用或者是否有占用内存特别大的对象无法被回收。



----------------------------
原文链接:https://blog.51cto.com/10983206/2551893

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-11-25 10:32:45 重新编辑]
  Java面向对象编程-->变量的作用域和初始化
  JavaWeb开发-->Servlet技术详解(Ⅱ)
  JSP与Hibernate开发-->使用JPA和注解
  Java网络编程-->RMI框架
  精通Spring-->Vue组件开发高级技术
  Vue3开发-->Vue指令
  解决javac编译错误: 编码UTF8/GBK的不可映射字符
  序列化与反序列化知识点汇总
  BIO模型的缺陷
  NIO模式的IO多路复用底层原理
  Java中保留数字的若干位小数位数的方法
  Java虚拟机(JVM)参数配置说明
  java.util.logging.Logger使用详解
  害怕面试被问HashMap?
  java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍
  Java入门实用代码:使用 Enumeration 遍历 HashTable
  Java入门实用代码:删除链表中的元素
  Java 入门实用代码: 数组差集
  Java入门实用代码: 字符串格式化
  正则表达式【匹配非字母和数字】
  java零基础入门-面向对象篇 抽象类
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。