JDK自带JVM调优工具,一次性打包讲给你听

Wesley13
• 阅读 438

关注“Java后端技术全栈”

回复“000”获取大量电子书

前面已经讲过了jps和jstat调优工具。今天我们继续说一下其它4个工具。这些工具都在jdk的bin目录下。

JDK自带JVM调优工具,一次性打包讲给你听

如何使用jinfo工具JDK自带JVM调优工具,一次性打包讲给你听

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

JDK自带JVM调优工具,一次性打包讲给你听

option说明

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

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

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

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

-flags  输出全部的参数

-sysprops  输出系统属性

我们可以先使用jps找到pid

JDK自带JVM调优工具,一次性打包讲给你听

jinfo pid会输出一堆相关信息

JDK自带JVM调优工具,一次性打包讲给你听

JDK自带JVM调优工具,一次性打包讲给你听

jinfo -flags pid

用来输出JVM的全部参数

JDK自带JVM调优工具,一次性打包讲给你听

jinfo -flag name pid

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

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

JDK自带JVM调优工具,一次性打包讲给你听

同样的可以使用

jinfo -flag [+|-]name pid

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

也可以使用

jinfo -sysprops pid

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

如何使用jmap工具JDK自带JVM调优工具,一次性打包讲给你听

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

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

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

jmap --help打印辅助信息

JDK自带JVM调优工具,一次性打包讲给你听

option说明

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

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

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

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

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

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

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

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

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

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

使用命名查看JVM的heap信息

jmap -heap pid

输出Java堆详细信息 ;

JDK自带JVM调优工具,一次性打包讲给你听

使用

jmap -histo:live pid

输出堆中对象的相关统计信息。

第一列是序号,

第二列是对象个数,

第三列是对象大小byte,

第四列是class name

JDK自带JVM调优工具,一次性打包讲给你听

使用

jmap -finalizerinfo pid

输出等待终结的对象信息

JDK自带JVM调优工具,一次性打包讲给你听

也可以使用

jmap -clstats pid

来输出类加载器信息 。

JDK自带JVM调优工具,一次性打包讲给你听

如何使用jstack工具JDK自带JVM调优工具,一次性打包讲给你听

jstack命令最大的作用就是用来生成thread dump文件,thread dump文件中记录了某一时刻CPU信息 。

jstack主要用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,

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

线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

JDK自带JVM调优工具,一次性打包讲给你听

option书面

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

jstack pid

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

JDK自带JVM调优工具,一次性打包讲给你听

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# 十进制转换为十六进制
4printf "%x\n" 21742

如何使用jhat工具JDK自带JVM调优工具,一次性打包讲给你听

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

常用方式

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

代码案例

1public 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

JDK自带JVM调优工具,一次性打包讲给你听

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

JDK自带JVM调优工具,一次性打包讲给你听

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

jhat heapDump

JDK自带JVM调优工具,一次性打包讲给你听

然后可以通过访问

http://localhost:7000/

JDK自带JVM调优工具,一次性打包讲给你听

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

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

JDK自带JVM调优工具,一次性打包讲给你听

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

JDK自带JVM调优工具,一次性打包讲给你听

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

觉得有帮助就帮忙点个“在看”呗~

推荐阅读:

《Spring Cloud与Docker微服务架构实战》.pdf

《Go语言实战》.pdf

《分布式Java应用基础与实践》.pdf

JDK自带JVM调优工具,一次性打包讲给你听

本文分享 CSDN - 田维常。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这