jvm常见分析工具

## 常见jvm分析工具主要是为了查错和进行调优

## 一、CLI

1、jps(java process status)

  jsp:

    -p 只显示pid 不显示class 名称,jar文件名和传递给main方法的参数

    -m 只显示输出main方法的参数 在嵌入式jvm上可能是null

    -l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名

    -v 输出传递给jvm的参数

    jps host 查看host的jps的情况 前提host提供jstatd服务

2、jstatd(了解·)

启动jvm监控服务他是一个基于rmi(远程接口调用)的应用,向远程机器提供本机jvm应用程序的信息,默认端口1099 -p指定端口

实例:jstatd -J-Djava.security.policy=my.policy &

my.policy文件需要自己建立,内如如下:

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

这是安全策略文件,因为jdk对jvm做了jaas(Java验证和授权API)的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作;

3.jmap

观察运行中的jvm物理内存的占用情况

jmap:

pid 进程号

常用参数

-heap:打印jvm heap(堆)的情况(垃圾收集器类型)

-histo:打印jvm heap的直方图 其输出信息包括类名,对象数量,对象占用大小

histo:live 同上但是只打印存活对象的情况

-permstat:打印permanent generation heap(方法区)情况(在jdk1.8之后不存在方法区)

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

```

[bigdata@bigdata01 jvm]$ jmap -heap 8580

Attaching to process ID 8580, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.112-b15

using thread-local object allocation.

Parallel GC with 4 thread(s)

-Xms:500m -Xmx:1000m    500M <= 堆空间 <= 1000m

Heap Configuration:

  MinHeapFreeRatio        = 0 ---->堆最小的空闲比例,此时堆的空间大小是多少:也就是说堆空间被占满,显然就是1000m

  MaxHeapFreeRatio        = 100 ---->堆最大的空闲比例,此时堆的空间大小是多少? 也就是说堆空间使用最小内存,显然就是500m

  MaxHeapSize              = 1048576000 (1000.0MB) 堆的最大空间大小

  NewSize                  = 21495808 (20.5MB) 新生代初始化空间大小

  MaxNewSize              = 349175808 (333.0MB) 新生代最大空间大小

  OldSize                  = 43515904 (41.5MB) 老年代的初始化空间大小

  NewRatio                = 2 老年代和新生代的内存空间比例=2:1,加入调整为3-->-XX:NewRatio=3

  SurvivorRatio            = 8 Eden区和survivor空间比例:8:1:1

  MetaspaceSize            = 21807104 (20.796875MB) jdk1.8之后叫做元数据区,就是jdk1.8以前的PermSize, 初始化空间大小

  CompressedClassSpaceSize = 1073741824 (1024.0MB) 压缩的类的空间大小

  MaxMetaspaceSize        = 17592186044415 MB 对应的最大空间大小

  G1HeapRegionSize        = 0 (0.0MB)

Heap Usage:

PS Young Generation 新生代

Eden Space:

  capacity = 73400320 (70.0MB) 容量

  used    = 11939112 (11.386024475097656MB) 已用大小

  free    = 61461208 (58.613975524902344MB) 空闲大小

  16.26574925013951% used

From Space:

  capacity = 4194304 (4.0MB)

  used    = 131072 (0.125MB)

  free    = 4063232 (3.875MB)

  3.125% used

To Space:

  capacity = 6815744 (6.5MB)

  used    = 0 (0.0MB)

  free    = 6815744 (6.5MB)

  0.0% used

PS Old Generation 老年代

  capacity = 76546048 (73.0MB)

  used    = 51528752 (49.14164733886719MB)

  free    = 25017296 (23.858352661132812MB)

  67.31732512173588% used

16790 interned Strings occupying 1695440 bytes.

```

用jmap 把进程内存使用情况dump(相当于导入)到文件中,在用jhat分析查看,jmap进行dump命令格式如下

jmap -dump:fromat=b,file=dempFileNmae pid

jmap -dump:fromat=b,file=4574.heap20151215 4574

Dumping heap to 4574.heap20151215 4574

Heap dump file created

dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:

jhat -port 9998 /tmp/dump.dat

注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。然后就可以在浏览器中输入主机地址:9998查看了。

注意:-J-Xmx512m中间没有空格。

4、jinfo(了解)

Configuration info

官方地址http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html

jinfo [option] pid

pid 进程号

参数如下:

no option:打印命令行参数和系统属性

-flags 打印命令行参数

-sysprops 打印系统属性

- h 帮助

-我们经常通过-D来给jvm传递自定义的系统参数

后台通过System.properties来获取这个参数,进而进行下一步的操作:

5、jstack

jstack :stack trace

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html

jstack 能得到运行java程序的java stack(java堆栈)和native stack(本地堆栈)的信息,可以轻松得知当前线程的运行情况

jstack[option] pid

参数如下

-l 长列表,打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表

-m 打印java和native c/c++框架的所有信息

tid指java Thread id。nid指native线程的id。prio是线程的优先级[0x00007fd4f8684000]是线程栈起始地址

dump 文件里 值得关注线程有:

死锁,Deadlock(重点关注)

等待资源,Waiting on condition(重点关注)

等待获取监视器,Waiting on monitor entry(重点关注)

阻塞,Blocked(重点关注)

执行中,Runnable 

暂停,Suspended

对象等待中,Object.wait() 或 TIMED_WAITING

停止,Parked

6、jstat

jstatd:java virtual Machine statistics Monitoring Tool

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html

Usage:jstat -help|-options

jstat -<option> [-t] [-h<lines>] <pid> [<interva[s|ms]> [<count>]]

参数解释:

Options -选项,我们一般使用-gcutil  /-gc查看gc情况

pid -VM的进程号,即当前运行的java进程号

interval[s|ms] --间隔时间,单位为秒或者毫秒,默认为ms。必须为正整型

count - 打印次数 如果缺省打印无数次

例如例如:jstat -gc 4645 500 10  表示查看进程号为4645的gc 每500ms打印一次  共打印10次

jstat -gc 8580 100ms 10

参数说明

S0C --->survivor-0 capacity

S1C --->survivor-1 capacity

S0U --->survivor-0 used

S1U --->survivor-1 used

EC --->eden capacity

EU --->eden used

OC --->old generation capacity

OU --->old generation used

MC --->metaspace capacity/jdk1.8以前叫PC

MU --->metaspace used/jdk1.8以前叫PU

CCSC --->compressed class space capacity

CCSU --->compressed class space used

YGC --->截止到目前为止总共执行了多少次ygc(minor gc)

YGCT --->截止到目前为止总共执行ygc消耗的时间(单位秒)

FGC --->截止到目前为止总共执行了多少次fullgc(minor gc)

FGCT --->截止到目前为止总共执行fullgc消耗的时间(单位秒)

GCT  --->截止到目前为止所有gc消耗的时间(单位秒)

## 二、GUI

1、jconsole 可视化的jvm监控软件

可以监控本地或者远程进程

主要包括:概括、内存、线程、类、Vm概要、Mbean选项卡

概括选项卡:呈现四副图表:主要包括堆内存使用量、类、线程、cpu占有率

内存选项卡:包括堆内存、非堆内存、内存池的使用量图表和详细信息。、相当于jstat命令

线程选项卡:显示所有的线程的信息图表、相当于jstack命令

类选项卡:加载类的信息

Vm概要:Vm的概要信息包括堆大小、垃圾收集信息、Vm参数等

Mbean选项:managed beans 被管理的beans

2、jvisualvm,

多合一的故障处理工具

visual vm是迄今为止,jdk发布的功能最强大的运行监视和故障处理程序。可以查看本都和远程的状态

优点:不需要被监控的程序基于特殊的Agent运型,因此他对应用程序的实际影响很小,这样他可以直接运行在生产环境中,这是其他监视工具比如:jprofile、yourkit无法与之相比的

visualvm.exe

主要特点:

1、插件安装。

2、生成、浏览堆转储快照和线程快照。

3、抽样器和profiler中分析程序性能。

4、BTrace插件动态日志跟踪。

# 三、 常见jvm调优参数总结

Java1.7的jvm参数查看一下官方网站。

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

Java1.8

http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html

Hotspotvm知识查看一下官方网站。

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html

主要的参数是:堆的大小、栈的大小、新生代和老年代的比值、新生代中eden和s0、s1的比值。

**-Xms:初始堆大小**,默认是物理内存的1/64。默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到--Xmx的最大限制。例如:-Xms 20m。

**-Xmx:最大堆大小**。默认是物理内存的1/4  默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。

-**XX:NewSize=n**:设置年轻代大小(初始值)。

**-XX:MaxNewSize**:设置年轻代最大值。

**-XX:NewRatio=n:**设置年轻代和年老代的比值。

**-XX:SurvivorRatio=n**:年轻代中Eden区与两个Survivor区的比值。

**-XX:PermSize**(1.8之后改为MetaspaceSize)  设置持久代(perm gen)初始值,默认是物理内存的1/64。

**-XX:MaxPermSize=n**:(1.8之后改为MaxMetaspaceSize)设置最大持久代大小。

**-Xss**:每个线程的堆栈大小。

面试的时候如何阐述jvm,gc

运行时区域--->gc(堆)--->不被引用的对象(引用?)--->判断对象是否被引用--->可达性分析(两次标记)---->gc使用方式(gc的算法)--->minor gc 或者major gc。

常见的优化参数:

​ -Xms

​ -Xmx

​ -XX:NewSize...

垃圾收集器

​ CMS、Serial、ParNew

常见的分析工具

​ jsp

​ jmap

​ jstack

​ jconsole

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 5,338评论 1 56
  • 堆内存设置 原理 JVM堆内存分为2块:Permanent Space 和 Heap Space。 Permane...
    superxcp阅读 1,948评论 0 0
  • 作者:一字马胡 转载标志 【2017-11-12】 更新日志 日期更新内容备注 2017-11-12新建文章初版 ...
    beneke阅读 2,183评论 0 7
  • 1、jdk 自带基础工具 2、MAT 分析dump 3、VM 实时监控 4 、遇到过OOM 内存溢出有哪些 1、J...
    smallsun512阅读 9,878评论 0 2
  • 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明 程序计数器:看做当前线程所执行的字节码行号指示器...
    jemmm阅读 2,219评论 0 9