Javajava road

常用Java命令-学习笔记

2018-07-11  本文已影响55人  HardWJJ

java常用命令

jps:查看本机的Java中进程信息。
jstack:打印线程的栈信息,制作线程Dump。
jmap:打印内存映射,制作堆Dump。
jstat:性能监控工具。
jhat:内存分析工具。
jconsole:简易的可视化控制台。
jvisualvm:功能强大的控制台。

jps是JDK 1.5提供的一个显示当前所有java进程pid的命令适合在linux/unix平台上简单察看当前java进程的一些简单情况。查看某个应用的日志会输出到哪里,或者启动的时候使用了哪些javaagent,那么我可以使用jps -v 查看进程的jvm参数情况。

使用:
接下来,为了详细介绍这些参数,在main方法里写一个while(true)的循环,查看java进程情况。代码如下:


image.png

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


image.png
-l:输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名:
image.png
-v:输出传递给JVM的参数,在启动main方法的时候,给jvm传递一个参数:-Dfile.encoding=UTF-8,执行jps -v:
image.png

-m: 输出传递给main 方法的参数,在嵌入式jvm上可能是null, 在这里,在启动main方法的时候,我给String[] args传递两个参数。hollis,chuang,执行jsp -m:


image.png

令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)

image.png

-F:当’jstack [-l] pid’没有相应的时候强制打印栈信息 -l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m:打印java和native c/c++框架的所有栈信息.
-h: | -help打印帮助信息 pid 需要被打印配置信息的java进程id,可以用jps查询.
首先,运行如下程序:


image.png

使用jps查看进程号:


image.png
然后使用jstack 查看堆栈信息:当前一共有一条用户级别线程,线程处于runnable状态,执行到JStackDemo1.java的第八行。 看下面代码:
image.png

jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成Heap Dump。在程序内存不足或者频繁gc,就可以借助jmap来制作Java堆dump来查看对象的情况。

使用jmap -help命令后:
1、 用法:
指定进程号(pid)的进程 jmap [ option ] 指定核心文件 jmap [ option ] 指定远程调试服务器 jmap [ option ] [server-id@]
2、参数:
option 选项参数是互斥的(不可同时使用)。想要使用选项参数,直接跟在命令名称后即可。
pid 需要打印配置信息的进程ID。该进程必须是一个Java进程。想要获取运行的Java进程列表,你可以使用jps。
executable 产生核心dump的Java可执行文件。
core 需要打印配置信息的核心文件。
remote-hostname-or-IP 远程调试服务器的(请查看jsadebugd)主机名或IP地址。
server-id 可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。
3、选项:
<no option> 如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。
4、举例:
查看java 堆(heap)使用情况(jmap -heap 12916):


image.png

查看堆内存中的对象数量及大小(jmap -histo 12916 这个命令执行,JVM会先触发gc,然后再统计信息):


image.png

能够显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图形的服务器上,它是运行期定位虚拟机性能问题的首选工具。

1、命令格式
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数解释:
option — 选项,我们一般使用 -gcutil 查看gc情况
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次
2、常见命令
jstat –class<pid> : 显示加载class的数量,及所占空间等信息。

jstat -compiler <pid>显示VM实时编译的数量等信息。
jstat -gc <pid>: 可以显示gc的信息,查看gc的次数,及时间。
jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小。
jstat -gcutil <pid>:统计gc信息。
jstat -gcnew <pid>:年轻代对象的信息。
jstat -gcnewcapacity<pid>: 年轻代对象的信息及其占用量。
jstat -gcold <pid>:old代对象的信息。
jstat -gcoldcapacity <pid>: old代对象的信息及其占用量。
jstat -gcpermcapacity<pid>: perm对象的信息及其占用量。
jstat -printcompilation <pid>:当前VM执行的信息。

使用jmap可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况。

案例:
一、导出dump文件
1、运行java程序


image.png

2、查看进程id(代码运行的进程是13572)


image.png
3、生成dump文件
image.png
image.png
二、解析Java堆转储文件,并启动一个 web server、

1、运行jhat命令,启动了一个http服务,端口是7000


image.png
2、访问http服务
image.png
三、分析
1、展示堆情况
image.png

javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。

1、用法:
-help 帮助
-l 输出行和变量的表
-public 只输出public方法和域
-protected 只输出public和protected类和成员
-package 只输出包,public和protected类和成员,这是默认的
-p -private 输出所有类和成员
-s 输出内部类型签名
-c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,
-verbose 输出栈大小,方法参数的个数
-constants 输出静态final常量
2、例子:
编译以下类:


image.png

在命令行上键入javap JavapDemo后,输出:


image.png
如果加入了-c,输出(字节码):
image.png

Java Dump

制作dump
1、使用java虚拟机制作dump
指示虚拟机在发生内存不足错误时,自动生成堆Dump
-XX:+HeapDumpOnOutOfMemoryError
2、使用图形化工具制作Dump

使用JDK(1.6)自带的工具:Java VisualVM

3、使用命令行制作Dump

jstack:打印线程的栈信息,制作线程Dump。
步骤:

  1. 检查虚拟机版本(java -version)
  2. 找出目标Java应用的进程ID(jps)
  3. 使用jstack命令制作线程Dump • Linux环境下使用kill命令制作线程Dump
  4. 使用jmap命令制作堆Dump

参考资料

上一篇 下一篇

猜你喜欢

热点阅读