java命令行工具(jps+jstat+jinfo+jmap+jstack)
cookqq ›博客列表 ›jvm

java命令行工具(jps+jstat+jinfo+jmap+jstack)

2017-09-29 10:44:04.0|分类: jvm|浏览量: 4917

摘要: java安装卸载的全过程,并且每一步对java文件的影响 jmap:java内存映像工具

1、搜索可以安装的jdk包

sudo apt-cache search openjdk-7-jdk


2、安装jdk包

sudo apt-get install openjdk-7-jdk 

安装成功之后查看文件夹下面的内容,发现有很多工具类

/usr/lib/jvm/java-7-openjdk-amd64/bin$ ls

appletviewer  idlj       java     javah         jcmd      jhat   jps         jstack  keytool       pack200     rmid         serialver   unpack200  xjc

apt           jar        javac    javap         jconsole  jinfo  jrunscript  jstat   native2ascii  policytool  rmiregistry  servertool  wsgen

extcheck      jarsigner  javadoc  java-rmi.cgi  jdb       jmap   jsadebugd   jstatd  orbd          rmic        schemagen    tnameserv   wsimport

java默认安装路径

conca@hnc:/usr/lib/jvm$ ls

default-java  java-1.7.0-openjdk-amd64  java-7-openjdk-amd64

命令执行位置/usr/bin/java


3、卸载jdk包

sudo apt-get remove openjdk-7-jdk 卸载之后剩余文件,还有java,只是没有了javac jstatck ...

/usr/lib/jvm/java-7-openjdk-amd64/bin$ ls

java  java-rmi.cgi  keytool  orbd  pack200  policytool  rmid  rmiregistry  servertool  tnameserv  unpack200

执行java命令,还是ok的~~ 证明java没有彻底卸载


4、彻底卸载jdk包

sudo apt-get autoremov 删除配置

conca@localhost:~$ java  再次执行java

-bash: /usr/bin/java: 没有那个文件或目录


查看java路径,java执行路径

whereis java

which java (java执行路径)

echo $JAVA_HOME

echo $PATH



5、jps命令

jps:虚拟机进程状况工具

可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(main class,class()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID。


jps命令格式:

jps [options] [hostid]

参数解释:

hostid:jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。

options参数说明:

-q 不输出类名、Jar名和传入main方法的参数

-m 输出传入main方法的参数

-l 输出main类或Jar的全限名

-v 输出传入JVM的参数


jps显示启动时候的参数:jps -v

blob.png

jps显示启动时候参数+main类:jps -v -l

blob.png

jps显示启动时候参数+mian类+main参数:jps -m -l -v

blob.png

tomcat启动的时候传入的参数是start


6、jstat:虚拟机统计信息见识工具

jstat是用于见识虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

jstat option vmid [interval[s|ms] [count]]

使用例子:

jstat -gc 10184 250 7

blob.png

S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)

EC、EU:Eden区容量和使用量

OC、OU:年老代容量和使用量

PC、PU:永久代容量和使用量

YGC、YGT:年轻代GC次数和GC耗时

FGC、FGCT:Full GC次数和Full GC耗时

GCT:GC总耗时

jstat -gcutil pid

注释:E表示Eden;s1,s1表示survivor0,survivor1;老年代o表示old,永久代p表示permanent

程序运行以来供放生Minor GC(YGC,表示Yong GC)122次,总耗时0.392,发生Full GC(FGC,表示Full GC)6次,(FGCT)总耗时为0.666。

blob.png

堆内存 = 年轻代 + 年老代 + 永久代

年轻代 = Eden区 + 两个Survivor区(From和To)

blob.png


7、jinfo : java 配置信息工具

jinfo(Configuration Info for java)的作用是实时地查看和调整虚拟机的各项参数。使用jps命令的-v参数可以查看虚拟机启动时显示指定的参数列表,但是想知道未被显示指定的参数的系统默认值,使用jinfo的-flag选项进行查询了。jinfo还可以使用-sysprops选项把虚拟机进程的System.getProperties()的内容打印出来。

jinfo命令格式:jinfo [option] pid

例子:


8、jmap:java内存映像工具

jmap(Memory Map for java ) 命令用于生成堆转储快照(一般被称为headdump 或dump文件)

jmap命令格式:jmap [option ] vmid

使用方法 jmap -histo pid。如果使用SHELL ,可采用jmap -histo pid>a.log日志将其保存到文件中。

145148_6DGC_200838.png

jmap -permstat pid

  打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息


jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况

blob.png


jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象


 class name是对象类型,说明如下:

    B  byte

    C  char

    D  double

    F  float

    I  int

    J  long

    Z  boolean

    [  数组,如[I表示int[]

    [L+类名 其他对象



用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:

jmap -dump:format=b,file=dumpFileName pid

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


root@ubuntu:/# jmap -dump:format=b,file=/tmp/dump.dat 10184

Dumping heap to /tmp/dump.dat ...

Heap dump file created

blob.png

sudo jmap -F -dump:format=b,file=/tmp/dump.dat 10184


9、jstack:java堆栈跟踪工具

jstack(stack trace for java) 命令用于审车个虚拟机当前时刻的线程快照(一般称为threahdump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间的停顿原因。


-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况

-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)


jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。

(1)第一步先找出Java进程ID,我部署在服务器上的Java应用名称为tomcat7

ps -ef | grep tomcat7 | grep -v grep

(2)第二步找出该进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid

(3)把最耗时的线程转换成十六进制

printf "%x\n" 21742

(4)输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep

    jstack 21711 | grep 54ee


10 Jconsole


blob.png


blob.png

参考文档:http://jiajun.iteye.com/blog/810150

https://my.oschina.net/feichexia/blog/196575

http://blog.csdn.net/sunny243788557/article/details/52796904






一键分享文章

分类列表

  • • struts源码分析
  • • flink
  • • struts
  • • redis
  • • kafka
  • • ubuntu
  • • zookeeper
  • • hadoop
  • • activiti
  • • linux
  • • 成长
  • • NIO
  • • 关键词提取
  • • mysql
  • • android studio
  • • zabbix
  • • 云计算
  • • mahout
  • • jmeter
  • • hive
  • • ActiveMQ
  • • lucene
  • • MongoDB
  • • netty
  • • flume
  • • 我遇到的问题
  • • GRUB
  • • nginx
  • • 大家好的文章
  • • android
  • • tomcat
  • • Python
  • • luke
  • • android源码编译
  • • 安全
  • • MPAndroidChart
  • • swing
  • • POI
  • • powerdesigner
  • • jquery
  • • html
  • • java
  • • eclipse
  • • shell
  • • jvm
  • • highcharts
  • • 设计模式
  • • 列式数据库
  • • spring cloud
  • • docker+node.js+zookeeper构建微服务
版权所有 cookqq 感谢访问 支持开源 京ICP备15030920号
CopyRight 2015-2018 cookqq.com All Right Reserved.