我爱编程

jvm工具链之jmap

2018-06-10  本文已影响0人  但时间也偷换概念

简述

命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

实战

笔者开发环境

Macos(unix)

jdk:1.8

ide:IDEA

jvm configuration:-Xms20m -Xmx20m -XX:NewSize=8m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

在笔者zsh终端输入jmap,或者在linux和windows命令行输入jmap,将显示以上option介绍

大概简述一下就是提供有各种option去实现各种功能,pid就是应用运行的进程id

常用的大概就是heap hist:live dump clstats这几个option了

举个栗子

笔者写了个Hello.java

然后运行main方法。

首先是通过jps找到这个运行类的pid,jps也可以加option,可以显示具体类名等信息,这种方式只支持当前用户应用,也就是在unix权限里如果是别人的应用,你就老老实实用pgrep之类的吧,反正我都告诉你了。

ok,找到了pid,下面来看看jmap能够做什么

heap

如上图,heap能够打印出jvm一些配置信息,如笔者这次运行的环境,就是Parnew+CMS收集器,然后堆是20M

New Generation和Old Generation分别是8M和12M,并且能够看出以上是新生代分为eden区和两个survivor区(from to),那么老年代使用的是mark sweep标记清除算法。然后还可以看到一些基础配置(Heap configuration),比如新老晋升阀值,新老比例,G1回收器单个region大小等。并且每个区域使用内存情况也有显示。

histo:live

还是刚才那个demo,笔者手残停止了应用,重新来一次,换了个1080pid。

可以看到histo:live打印的是存活状态对象的内存占用情况。

一般来说有经验的调优者在遇到OOM的时候,可以从histo这里看到是否有明显的hashtable过多之类的代码问题。

clstats

这个就是类加载的信息展示了,像什么ApplicationClassLoader和ExtClassLoader,分别是应用层和第三方加载器,这个大家自己去深入理解java虚拟机里面具体学习了,不多介绍了,我这个样例没有准备解释BootStrap双亲委派 自定义加载等demo。

dump

命令:jmap -dump:format=b,file=heapdump.phrof pid

描述:生成堆转储快照dump文件。

dump就会生成到显示的目录里了。

上一篇下一篇

猜你喜欢

热点阅读