常用Java命令-学习笔记
java常用命令
- jdk在bin目录下包含的命令和工具
jps:查看本机的Java中进程信息。
jstack:打印线程的栈信息,制作线程Dump。
jmap:打印内存映射,制作堆Dump。
jstat:性能监控工具。
jhat:内存分析工具。
jconsole:简易的可视化控制台。
jvisualvm:功能强大的控制台。
-
jps:查看本机的Java中进程信息。
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
-
jstack:java虚拟机自带的一种堆栈跟踪工具
image.png令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)
-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:打印内存映射,制作堆Dump
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
-
jstat:用于监控虚拟机各种运行状态信息的命令行工具
能够显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、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执行的信息。
-
jstat:是一个用来分析java的堆情况的命令
使用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
-
jstat:javap是jdk自带的一个工具,可以对代码反编译查看java编译器生成的字节码。
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
- Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。
- 线程Dump,包含所有线程的运行状态。
- 堆Dump,包含线程Dump,包含所有堆对象的状态。
- 补足传统Bug分析手段的不足: 可在任何Java环境使用;信息量充足。 针对非功能正确性的Bug,主要为:多线程幵发、内存泄漏。
制作dump
1、使用java虚拟机制作dump
指示虚拟机在发生内存不足错误时,自动生成堆Dump
-XX:+HeapDumpOnOutOfMemoryError
2、使用图形化工具制作Dump
使用JDK(1.6)自带的工具:Java VisualVM
3、使用命令行制作Dump
jstack:打印线程的栈信息,制作线程Dump。
步骤:
- 检查虚拟机版本(java -version)
- 找出目标Java应用的进程ID(jps)
- 使用jstack命令制作线程Dump • Linux环境下使用kill命令制作线程Dump
- 使用jmap命令制作堆Dump