作者:乐多体育 | 发表于:2023-01-03 | 阅读:79次

经过一天的学习,小弟对jdk的bin目录下常用的命令做个总体的简单的总结,为今后更深入的去学习jvm底层、jvm调优、垃圾回收、线上问题处理等打下夯实的基础。

示例代码

public class TestCMD { public static void main(String[] args) { System.out.println("Hello World!"); }}

以下操作均在IDEA的命令终端Terminal下进行演示。

1.【javac】

将一个java源文件编译成class文件。

E:IDEaworkspaceMyStudyProjectsrccncomstudy>javac TestCMD.java

在study包下可以看到生成了TestCMD.class字节码文件(十六进制的),当然也可以直接运行在项目的out文件夹中也会看到相关字节码文件。该字节码中定义了魔数信息、版本号、常量池等信息,感兴趣的同学可以深入的了解一下。当然如果用javap反汇编后再阅读会轻松的多。

2.【java】

运行字节码文件、查看版本信息等。

E:ideaworkspaceMyStudyProjectsrc>java cn.com.study.TestCMDHello World! E:ideaworkspaceMyStudyProjectsrc>java -versionjava 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:ideaworkspaceMyStudyProjectsrc>jar cvf my.jar cn//往my.jar 里添加other包E:ideaworkspaceMyStudyProjectsrc>jar uf my.jar other//解压jarE:ideaworkspaceMyStudyProjectsrc>jar xvf my.jar

比如:在实际项目中可以写一个工具包,然后打包成jar,在别的项目直接依赖即可。

4.【javadoc】

JDK定义了如@author、@version、@since、@see、@link、@code、@param、@return、@exception、@throws等文档标记.javadoc是JDK提供给程序员的一个文档生成工具。

5.【javap】*

反汇编命令,这个命令非常重要,在今后去学习字节码指令集时会经常使用它去反汇编class文件,方便我们从底层查看代码的执行过程。

E:ideaworkspaceMyStudyProjectsrccncomstudy>javap -c TestCMD.classCompiled 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."":()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:ideaworkspaceMyStudyProjectsrccncomstudy>javap -help用法: javap 其中, 可能的选项包括: -help --help -? 输出此用法消息 -version 版本信息 -v -verbose 输出附加信息 -l 输出行号和本地变量表 -public 仅显示公共类和成员 -protected 显示受保护的/公共类和成员 -package 显示程序包/受保护的/公共类 和成员 (默认) -p -private 显示所有类和成员 -c 对代码进行反汇编 -s 输出内部类型签名 -sysinfo 显示正在处理的类的 系统信息 (路径, 大小, 日期, MD5 散列) -constants 显示最终常量 -classpath 指定查找用户类文件的位置 -cp 指定查找用户类文件的位置 -bootclasspath 覆盖引导类文件的位置

6.【jdb】

断点调试,IDE的断点可以本地调试生产环境代码,但是却不能在线调试,这时候就可以使用jdb了。具体用法感兴趣的同学可以实操一下。

7.【jps】

JVM 进程状态工具。

//查看进程号E:ideaworkspaceMyStudyProjectsrccncomstudy>jps1040010848 Jps10916 TestCMD11660 Launcher//查看jvm参数信息E:ideaworkspaceMyStudyProjectsrccncomstudy>jps -v10400 -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX: UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -XX: HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -javaagent:E:ideaIntelliJ IDEA 2017.1.2binJetbrainsCrack-2.6.2.jar -Djb.vmOptionsFile=E:ideaIntelliJ IDEA 2017.1.2binidea64.exe.vmoptions -Xbootclasspath/a:E:ideaIntelliJ IDEA2017.1.2libboot.jar -Didea.jre.check=true -Didea.paths.selector=IntelliJIdea2017.1 -XX:ErrorFile=C:UsersAdministratorjava_error_in_idea_%p.log -XX:HeapDumpPath=C:UsersAdministratorjava_error_in_idea.hprof

8.【jstat】

jstat用于查看运行的JVM实例的运行数据。在实际工作中经常用它获取垃圾回收情况,方便进行故障的排查、jvm调优等操作。

//比如在linux系统中通过top、或者查找tomcat进程获取到PID//查看PID为31615这个进程的类加载信息,每1秒查看一次,总共查看3次,一致输出的话次数写成-1jstat -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:ideaworkspaceMyStudyProjectsrccncomstudy>jps1040010912 Launcher11240 TestCMD9916 Jps//使用jmap查看堆信息E:ideaworkspaceMyStudyProjectsrccncomstudy>jmap -J-d64 -heap 11240Attaching to process ID 11240, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.151-b12using thread-local object allocation.Parallel GC with 4 thread(s)//堆配置信息 jdk1.8Heap 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 GenerationEden Space: capacity = 32505856 (31.0MB) used = 3251768 (3.1011276245117188MB) free = 29254088 (27.89887237548828MB) 10.003637498424899% usedFrom Space: capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% usedTo Space: capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% usedPS Old Generation capacity = 87031808 (83.0MB) used = 0 (0.0MB) free = 87031808 (83.0MB) 0.0% used1782 interned Strings occupying 179864 bytes.

13.【jhat】

jhat和 jmap配合使用,通过jmap生成的dump文件可以通过jhat解析浏览。通常我们都会使用上面提到的图像化工具jvisualvm。

14.【jstack】*

jstack用于打印指定进程的调用堆栈信息。如果是在64位机器上运行,可以加一个-J-d64参数。在实际工作中,通常使用此命令分析线上遇到的死锁、内存溢出等情况。

jstack -J-d64 29869E:ideaworkspaceMyStudyProjectsrccncomstudy>jps1040011840 Launcher7600 TestCMD11956 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:ideaworkspaceMyStudyProjectsrccncomstudy>jps1040011892 Launcher12140 TestCMD7756 Jps//可查询参数E:ideaworkspaceMyStudyProjectsrccncomstudy>jcmd 12140 help12140:The following commands are available:JFR.stopJFR.startJFR.dumpJFR.checkVM.native_memoryVM.check_commercial_featuresVM.unlock_commercial_featuresManagementAgent.stopManagementAgent.start_localManagementAgent.startGC.rotate_logThread.printGC.class_statsGC.class_histogramGC.heap_dumpGC.run_finalizationGC.runVM.uptimeVM.flagsVM.system_propertiesVM.command_lineVM.versionhelp//例如查看jvm参数信息 也可使用 jinfo 12140 查看E:ideaworkspaceMyStudyProjectsrccncomstudy>jcmd 12140 VM.flags12140:-XX:CICompilerCount=3 -XX:InitialHeapSize=130023424 -XX:MaxHeapSize=2069889024 -XX:MaxNewSize=689963008 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=42991616 -XX:OldSize=87031808 -XX: UseCompressedClassPointers -XX: UseCompressedOops -XX: UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX: UseParallelGC

以上就是小弟今日的学习成果!bin目录下还是很多其他的命令,小弟在此就不过多的介绍了,毕竟水平有限。文章中有不对的地方欢迎各位前辈给小弟指出来,小弟不胜感激!与各位小伙伴一起加油!每天变强一点点!

特别声明:所有资讯或言论仅代表发布者个人意见,乐多体育仅提供发布平台,信息内容请自行判断。

标签: 简介 常用命令 目录下

相关资讯