经过一天的学习,小弟对 jdk 的bin目录下常用的命令做个总体的简单的总结,为今后更深入的去学习 jvm 底层、jvm调优、垃圾回收、线上问题处理等打下夯实的基础。
示例代码
public class Test CMD {
public static void main(String[] args) {
System.out.println(" Hello World !");
}
}
以下操作均在 IDEA 的命令终端 Terminal 下进行演示。
1.【 javac 】
将一个java源文件编译成 class文件 。
E:\ IDE aworkspace\MyStudyProject\src\cn\com\study>javac TestCMD.java
在study包下可以看到生成了TestCMD.class字节码文件(十六进制的),当然也可以直接运行在项目的out文件夹中也会看到相关 字节码 文件。该字节码中定义了 魔数 信息、版本号、常量池等信息,感兴趣的同学可以深入的了解一下。当然如果用javap反汇编后再阅读会轻松的多。
2.【java】
运行字节码文件、查看版本信息等 。
E:\ideaworkspace\MyStudyProject\src>java cn.com.study.TestCMD
Hello World!
E:\ideaworkspace\MyStudyProject\src>java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
3.【 jar 】
打包、更新、解包java应用程序。
//将cn目录创建为一个jar文件 c:创建 v:打印输出 f:指定的jar文件
E:\ideaworkspace\MyStudyProject\src>jar cvf my.jar cn
//往my.jar 里添加other包
E:\ideaworkspace\MyStudyProject\src>jar uf my.jar other
//解压jar
E:\ideaworkspace\MyStudyProject\src>jar xvf my.jar
比如:在实际项目中可以写一个工具包,然后打包成jar,在别的项目直接依赖即可。
4.【 javadoc 】
JDK定义了如@author、@version、@since、@see、@link、@code、@param、@return、@ exception 、@throws等文档标记.javadoc是JDK提供给程序员的一个文档生成工具。
5.【javap】*
反汇编命令,这个命令非常重要,在今后去学习字节码指令集时会经常使用它去反汇编class文件,方便我们从底层查看代码的执行过程。
E:\ideaworkspace\MyStudyProject\src\cn\com\study>javap -c TestCMD.class
Compiled from "TestCMD.java"
public class cn.com.study.TestCMD {
// 构造方法
public cn.com.study.TestCMD();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
//main方法
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Hello World!
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
E:\ideaworkspace\MyStudyProject\src\cn\com\study>javap -help
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p - private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
6.【 jdb 】
断点调试,IDE的断点可以本地调试生产环境代码,但是却不能在线调试,这时候就可以使用jdb了。具体用法感兴趣的同学可以实操一下。
7.【jps】
JVM 进程状态工具。
//查看进程号
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jps
10400
10848 Jps
10916 TestCMD
11660 Launcher
//查看jvm参数信息
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jps -v
10400 -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=fal
se -Djava.net.preferIPv4Stack=true -XX:+HeapDumpOn OutOfMemory Error -XX:-OmitStackTraceInFastThrow -javaagent:E:\idea\IntelliJ IDEA 2017.1.2\bi
n\JetbrainsCrack-2.6.2.jar -Djb.vmOptions File =E:\idea\IntelliJ IDEA 2017.1.2\bin\idea64.exe.vmoptions -Xbootclasspath/a:E:\idea\IntelliJ IDEA
2017.1.2\lib\boot.jar -Didea.jre.check=true -Didea.paths.selector=IntelliJIdea2017.1 -XX:ErrorFile=C:\Users\Administrator\java_error_in_idea_%
p.log -XX:HeapDumpPath=C:\Users\Administrator\java_error_in_idea.hprof
8.【jstat】
jstat用于查看运行的 JVM 实例的运行数据。在实际工作中经常用它获取垃圾回收情况,方便进行故障的排查、jvm调优等操作。
//比如在linux系统中通过top、或者查找 tomcat 进程获取到 PID
//查看PID为31615这个进程的类加载信息,每1秒查看一次,总共查看3次,一致输出的话次数写成-1
jstat -class 31615 1000 3
//编译信息
jstat -compiler 31615
//GC信息 每1秒查看一次,总共查看3次
jstat -gc 31615 1000 3
9.【jstatd】
远程监控。
jstatd同样用于监控JVM实例,不同于jstat的是它通过RMI方式,
需要在被监控的java.home的bin下添加一个策略文件jstatd.all.policy:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
然后进入jdk的bin目录输入:
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi. Server .hostname=ip地址 -p 端口号
就启动了jstatd,下面就可以通过jvisualvm通过RMI的方式监控这台机器上的全部JVM实例。
10.【jvisualvm】
jvisualvm是JDK提供的图形化jstat工具。可以监控本地的JVM实例,也可以通过JMX或RMI的方式监控远程的JVM实例。在这个工具当中可以获取到jvm实例的线程、类、堆内存等信息,通常处理线上问题时,我们可以通过jmap命令保存当前堆栈信息,然后导入该工具进行问题排查。
11.【jinfo】
jinfo用于打印特定JVM实例的配置信息。如果是运行在64位机器上,需要加一个-J-d64选项
//比如我想查看29869这个进程运行的基本配置信息
jinfo 29869
//如果仅仅想查看JVM的 系统变量
jinfo -sysprops 29869
12.【jmap】*
jmap用于查看对象内存占用情况或指定的JVM实例堆内存情况。如果是JVM是运行在64位机器上,则需要添加-J-d64选项。通常我们在对线上问题排查、jvm调优等操作时都会用到此命令。
//比如先通过jps查找当前进程号
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jps
10400
10912 Launcher
11240 TestCMD
9916 Jps
//使用jmap查看堆信息
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jmap -J-d64 -heap 11240
Attaching to process ID 11240, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
using thread-local object allocation.
Parallel GC with 4 thread(s)
//堆配置信息 jdk1.8
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2069889024 (1974.0MB)
NewSize = 42991616 (41.0MB)
MaxNewSize = 689963008 (658.0MB)
OldSize = 87031808 (83.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
// 堆内存 使用信息
Heap Usage:
PS Young Generation
Eden Space:
capacity = 32505856 (31.0MB)
used = 3251768 (3.1011276245117188MB)
free = 29254088 (27.89887237548828MB)
10.003637498424899% used
From Space:
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
To Space:
capacity = 5242880 (5.0MB)
used = 0 (0.0MB)
free = 5242880 (5.0MB)
0.0% used
PS Old Generation
capacity = 87031808 (83.0MB)
used = 0 (0.0MB)
free = 87031808 (83.0MB)
0.0% used
1782 interned Strings occupying 179864 bytes.
13.【jhat】
jhat和 jmap配合使用,通过jmap生成的dump文件可以通过jhat解析浏览。通常我们都会使用上面提到的图像化工具 jvisualvm。
14.【jstack】*
jstack用于打印指定进程的调用堆栈信息。如果是在64位机器上运行,可以加一个 -J-d64 参数。在实际工作中,通常使用此命令分析线上遇到的 死锁 、内存溢出等情况。
jstack -J-d64 29869
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jps
10400
11840 Launcher
7600 TestCMD
11956 Jps
//信息太多了 就不截完整的信息了 我在TestCMD中使用了sleep
"main" #1 prio=5 os_prio=0 tid=0x00000000025b8000 nid=0x2ff0 waiting on condition [0x000000000295f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at cn.com.study.TestCMD.main(TestCMD.java:7)
15.【jcmd】
JVM 诊断命令工具 – 向正在运行的 Java 虚拟机发送诊断命令请求。
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jps
10400
11892 Launcher
12140 TestCMD
7756 Jps
//可查询参数
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jcmd 12140 help
12140:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM. uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help
//例如查看jvm参数信息 也可使用 jinfo 12140 查看
E:\ideaworkspace\MyStudyProject\src\cn\com\study>jcmd 12140 VM.flags
12140:
-XX:CICompilerCount=3 -XX:InitialHeapSize=130023424 -XX:MaxHeapSize=2069889024 -XX:MaxNewSize=689963008 -XX:MinHeapDeltaBytes=524288 -XX:NewSi
ze=42991616 -XX:OldSize=87031808 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndi
vidualAllocation -XX:+UseParallelGC
以上就是小弟今日的学习成果! bin 目录下还是很多其他的命令,小弟在此就不过多的介绍了,毕竟水平有限。文章中有不对的地方欢迎各位前辈给小弟指出来,小弟不胜感激!与各位小伙伴一起加油!每天变强一点点!