在java的/bin目录下有许多java自带的工具。
我们常用的有
基础工具
jar:创建和管理jar文件
java:java运行工具,用于运行class文件或jar文件
javac:java的编译器
javadoc:java的API文档生成工具
性能监控和故障处理
jps
jstat
jinfo
jmap
hstack
可视化故障处理工具
JConsole
JHSDB
jps:用于显示当前运行的Java进程的PID
jps命令显示的Java进程ID(PID)就是操作系统中的进程ID(Process ID)。这是每个进程在操作系统中的唯一标识符。jps列出的PID与ps、top等操作系统工具列出的PID是一致的。
常用参数
-l:显示主类的全限定名或JAR文件的完整路径。
jps -l
示例输出:
12345 com.example.MyJavaApp
67890 sun.tools.jps.Jps
-v:显示传递给Java虚拟机的参数。
jps -v
示例输出:
12345 MyJavaApp -Xmx1024m
67890 Jps -Dapplication.home=/usr/lib/jvm/java-14
-m:显示传递给主类的参数。
jps -m
示例输出:
12345 MyJavaApp arg1 arg2
67890 Jps
jstat:虚拟机的类加载信息,内存信息,垃圾回收,运行时编译的统计信息
查看类加载信息
jstat -class 12345
输出示例:
Loaded Bytes Unloaded Bytes Time(ms)
1000 5000 50 200 300
查看垃圾回收信息:jstat -gc 12345
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 1024.0 512.0 0.0 8192.0 4096.0 10240.0 8192.0 5120.0 2048.0 640.0 320.0 5 0.050 2 0.100 0.150
S0C (Survivor 0 Capacity):第一个幸存区的容量,单位是KB。
S1C (Survivor 1 Capacity):第二个幸存区的容量,单位是KB。
S0U (Survivor 0 Utilization):第一个幸存区的已使用空间,单位是KB。
S1U (Survivor 1 Utilization):第二个幸存区的已使用空间,单位是KB。
EC (Eden Capacity):Eden区的容量,单位是KB。
EU (Eden Utilization):Eden区的已使用空间,单位是KB。
OC (Old Capacity):老年代的容量,单位是KB。
OU (Old Utilization):老年代的已使用空间,单位是KB。
MC (Metaspace Capacity):元数据区的容量,单位是KB。
MU (Metaspace Utilization):元数据区的已使用空间,单位是KB。
CCSC (Compressed Class Space Capacity):压缩类空间的容量,单位是KB。
CCSU (Compressed Class Space Utilization):压缩类空间的已使用空间,单位是KB。
YGC (Young Generation GC Count):年轻代垃圾收集的次数。
YGCT (Young Generation GC Time):年轻代垃圾收集的总时间,单位是秒。
FGC (Full GC Count):完全垃圾收集的次数。
FGCT (Full GC Time):完全垃圾收集的总时间,单位是秒。
GCT (Total GC Time):垃圾收集的总时间(年轻代和完全垃圾收集的总和),单位是秒。
每1秒输出一次gc快照,输出5次:jstat -gcutil 30500 1000 5
jstat -gcutil命令的输出以百分比形式显示各个内存区域的利用率(即已使用内存占总内存的比例)
jvm的内存配置情况:jstat -gccapacity 30500
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC
512.0 10240.0 8192.0 1024.0 1024.0 6144.0 10240.0 20480.0 10240.0 10240.0 512.0 1024.0 512.0
NGCMN:新生代最小容量。
NGCMX:新生代最大容量。
NGC:当前新生代容量。
S0C、S1C:第一个和第二个幸存区的容量。
EC:Eden区的容量。
OGCMN:老年代最小容量。
OGCMX:老年代最大容量。
OGC:当前老年代容量。
OC:当前老年代容量(通常和OGC相同)。
MCMN:元数据区最小容量。
MCMX:元数据区最大容量。
MC:当前元数据区容量。
jstat -gcold,-gcnew等
jinfo
jvm的常用参数
内存
jvm的最大使用内存,最小使用内存
jvm的新生代的最大最小使用内存
元空间的最大最小使用内存
栈的最大最小内存
性能调优相关参数:
-XX:ParallelGCThreads: 设置并行垃圾收集器的线程数。
-XX:ConcGCThreads: 设置并发垃圾收集器的线程数。
-XX:SurvivorRatio: 设置新生代中Eden区与Survivor区的比例。
-XX:MaxTenuringThreshold: 设置对象在新生代中经过多少次GC后进入老年代。
jinfo -flags:显示所有JVM标志及其值
VM Flags:
-XX:CICompilerCount=12 //设置即时编译器(JIT)线程数为12,用于提升编译性能。
-XX:ConcGCThreads=3 //分层编译最多只进行到级别1,通常意味着只进行简单的编译优化。
-XX:+UseG1GC //启用 G1 垃圾收集器
-XX:G1ConcRefinementThreads=13 //设置 G1 垃圾收集器的并发精炼线程数为13,用于处理记忆集的并发更新
-XX:G1EagerReclaimRemSetThreshold=16 //设置 G1 垃圾收集器在回收记忆集时的早期阈值
-XX:G1HeapRegionSize=2097152 //设置 G1 垃圾收集器堆区域的大小为2MB
-XX:G1RemSetArrayOfCardsEntries=16
-XX:G1RemSetHowlMaxNumBuckets=8
-XX:G1RemSetHowlNumBuckets=8
-XX:GCDrainStackTargetSize=64
-XX:InitialHeapSize=266338304 //堆大小
-XX:+ManagementServer
-XX:MarkStackSize=4194304
-XX:MaxHeapSize=4236247040
-XX:MaxNewSize=2541748224
-XX:MinHeapDeltaBytes=2097152
-XX:MinHeapSize=8388608
-XX:NonProfiledCodeHeapSize=0
-XX:-ProfileInterpreter
-XX:ProfiledCodeHeapSize=0
-XX:SoftMaxHeapSize=4236247040
-XX:TieredStopAtLevel=1
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:+UseFastUnorderedTimeStamps
-XX:-UseLargePagesIndividualAllocation
jinfo -flag MaxHeapSize 30500:查看特定标志的值
jinfo -flag MaxHeapSize=2147483648 12345:修改特点的标志值
jmap:查看jvm内存使用情况
1. 生成堆转储(Heap Dump)
使用 jmap 可以生成 Java 进程的堆转储文件,以便后续分析和诊断内存问题。
jmap -dump:format=b,file=<dump_file_path>
-dump:format=b,file=<dump_file_path>: 指定生成堆转储文件的格式为二进制(b),并指定转储文件的路径。
: Java 进程的进程号(PID)。
例如,要生成一个名为 heapdump.bin 的堆转储文件,可以执行以下命令:
jmap -dump:format=b,file=heapdump.bin
2. 查看堆内存使用情况
可以使用 jmap 查看堆内存的使用情况和统计信息,包括堆的大小、使用量、空闲量等。
jmap -heap
例如:
jmap -heap
3. 查看堆中对象统计信息
jmap 可以输出堆中各个类的实例数量和占用内存等信息。
jmap -histo
例如:
jmap -histo
4. 查看类加载器信息
可以使用 jmap 查看已加载类的详细信息和类加载器的关系。
jmap -clstats
例如:
jmap -clstats
jstack:线程状态,定位线程死锁、查看线程状态、分析线程间的互相等待
查看所有线程
jstack 30500
检测死锁
jstack -l -F