這篇文章主要講解了“有哪些JDK內(nèi)置命令”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“有哪些JDK內(nèi)置命令”吧!
我們一直強(qiáng)調(diào)做網(wǎng)站、網(wǎng)站設(shè)計(jì)對(duì)于企業(yè)的重要性,如果您也覺(jué)得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過(guò)程中的有力推手。專(zhuān)業(yè)網(wǎng)絡(luò)公司不一定是大公司,創(chuàng)新互聯(lián)公司作為專(zhuān)業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
使用 javap
可以查看 Java 字節(jié)碼反編譯的源文件,javap
的命令格式如下:
下面來(lái)演示下用 javap -c
對(duì)代碼進(jìn)行反編譯,首先寫(xiě)個(gè) HelloWorld
類(lèi),如下:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}
接著使用 javap -c HelloWorld.class
就可以反編譯得到如下結(jié)果:
Compiled from "HelloWorld.java"
public class HelloWorld {
public HelloWorld();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
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
}
jps
是用來(lái)查詢當(dāng)前所有進(jìn)程 pid 的,命令的用法如下圖所示:
執(zhí)行 jps
可以獲取本機(jī) Java 程序的 pid,運(yùn)行結(jié)果如下:
[root@wupx ~]# jps
8825 spring-boot-0.0.1-SNAPSHOT.jar
使用 jps -mlvV
可以獲取到這個(gè)進(jìn)程的 pid、jar 包的名字以及 JVM 參數(shù)等。
[root@wupx ~]# jps -mlvV
8825 /root/spring-boot-0.0.1-SNAPSHOT.jar --server.port=8090 --logging.file=/root/log/spring-boot.log -Xmx1024m -Xms1024m
jstat
主要用于監(jiān)控 JVM,主要是 GC 信息,在性能優(yōu)化的時(shí)候經(jīng)常用到,命令內(nèi)容如下所示:
比如,上面我們通過(guò) jps
查到的進(jìn)程號(hào) 8825,我們使用 jstat -gc 8825
來(lái)查看該進(jìn)程的 GC 信息:
[root@wupx ~]# jstat -gc 8825
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
65536.0 69120.0 0.0 160.0 10425344.0 1036247.8 21135360.0 19489859.7 84608.0 81123.8 9600.0 8834.1 99517 2070.459 0 0.000 2070.459
其中 S0C
表示當(dāng)前 Survivor0
的容量,S1C
表示當(dāng)前 Survivor1
的容量,S0U
表示當(dāng)前 Survivor0
的利用率,S1U
表示當(dāng)前 Survivor1
的利用率,EC
表示 Eden 的容量,EU
表示 Eden 的利用率,OC
表示老年代的容量,OU
表示老年代的利用率,MC
表示 Metaspace 的容量,MU
表示 Metaspace 的利用率,CCSC
表示類(lèi)指針壓縮空間容量,CCSU
表示使用的類(lèi)指針壓縮空間,YGC
表示新生代 GC 的次數(shù),YGCT
表示新生代 GC 的時(shí)間,FGC
表示 Full Gc 的次數(shù),FGCT
表示 Full GC 的時(shí)間,GCT
表示 GC 總時(shí)間。
每個(gè)對(duì)象都有一個(gè)指向它自身類(lèi)的指針,_klass: 指向類(lèi)的 4 字節(jié)指針,64 位平臺(tái)上 _klass: 指向類(lèi)的 8 字節(jié)的指針,為了節(jié)約這些空間,引入了類(lèi)指針壓縮空間。
jcmd
可以查看 JVM 信息,常用的命令內(nèi)容如下:
先使用 jcmd 8825 help
來(lái)查看都支持什么命令:
[root@wupx ~]# jcmd 8825 help
8825:
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
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help
下面我就選一個(gè)參數(shù)給大家舉個(gè)例子,比如打印堆的信息,使用 jcmd 8825 GC.heap_dump
命令:
[root@wupx ~]# jcmd 8825 GC.heap_info
8825:
PSYoungGen total 628736K, used 41772K [0x0000000715a00000, 0x0000000746480000, 0x00000007c0000000)
eden space 609792K, 4% used [0x0000000715a00000,0x00000007173d5478,0x000000073ad80000)
from space 18944K, 80% used [0x000000073ad80000,0x000000073bc75e68,0x000000073c000000)
to space 19968K, 0% used [0x0000000745100000,0x0000000745100000,0x0000000746480000)
ParOldGen total 250880K, used 21756K [0x00000005c0e00000, 0x00000005d0300000, 0x0000000715a00000)
object space 250880K, 8% used [0x00000005c0e00000,0x00000005c233f160,0x00000005d0300000)
Metaspace used 44797K, capacity 45562K, committed 45824K, reserved 1089536K
class space used 5669K, capacity 5832K, committed 5888K, reserved 1048576K
可以看出可以獲取新生代、老年代、元空間、Eden、From Survivor 以及 To Survivor 的大小和占比。
jmap
打印出 Java 進(jìn)程內(nèi)存中 Object 的情況,或者將 JVM 中的堆以二進(jìn)制輸出成文本,命令內(nèi)容如下:
使用 jmap -heap 8825
查看當(dāng)前堆的使用信息:
[root@wupx ~]# jmap -heap 8825
Attaching to process ID 8825, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09
using thread-local object allocation.
Parallel GC with 10 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 8575254528 (8178.0MB)
NewSize = 178782208 (170.5MB)
MaxNewSize = 2858418176 (2726.0MB)
OldSize = 358088704 (341.5MB)
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 = 624427008 (595.5MB)
used = 32083672 (30.597373962402344MB)
free = 592343336 (564.9026260375977MB)
5.138098062536078% used
From Space:
capacity = 19398656 (18.5MB)
used = 15687272 (14.960548400878906MB)
free = 3711384 (3.5394515991210938MB)
80.86782919394004% used
To Space:
capacity = 20447232 (19.5MB)
used = 0 (0.0MB)
free = 20447232 (19.5MB)
0.0% used
PS Old Generation
capacity = 256901120 (245.0MB)
used = 22278496 (21.246429443359375MB)
free = 234622624 (223.75357055664062MB)
8.672012017697703% used
24741 interned Strings occupying 2987512 bytes.
首先會(huì)打印堆的一些相關(guān)配置,比如最大新生代、元空間的大小等;下面為堆的使用情況,包括新生代的 Eden 區(qū)、S0 區(qū)、S1 區(qū)以及老年代。
jmap
還可以將堆的信息以文件的形式保存下來(lái),相當(dāng)于文件快照,執(zhí)行 jmap -dump:live,format=b,file=heap.bin 8825
命令:
[root@wupx ~]# jmap -dump:live,format=b,file=heap.bin 8825
Dumping heap to /root/heap.bin ...
Heap dump file created
這個(gè) heap.bin
可以使用 jhat
命令打開(kāi),是以 html 的形式展示的。
jhat
分析 Java 堆的命令,可以將堆中對(duì)象以 html
的形式顯示出來(lái),支持對(duì)象查詢語(yǔ)言 OQL,命令內(nèi)容如下:
現(xiàn)在執(zhí)行 jhat -port 9999 heap.bin
來(lái)將剛剛保存的 heap.bin
以 html 展示出來(lái):
[root@wupx ~]# jhat -port 9999 heap.bin
Reading from heap.bin...
Dump file created Tue May 12 22:31:55 CST 2020
Snapshot read, resolving...
Resolving 570997 objects...
Chasing references, expect 114 dots..................................................................................................................
Eliminating duplicate references..................................................................................................................
Snapshot resolved.
Started HTTP server on port 9999
Server is ready.
執(zhí)行完畢后,打開(kāi) http://localhost:9999/
就可以看到類(lèi)的實(shí)例的堆占用情況,它是按照包名來(lái)分組的:
網(wǎng)頁(yè)的底部還有許多 Query 方式:
下面以 OQL 為例,打開(kāi)后是一個(gè)類(lèi)似 SQL 查詢的窗口,比如輸入 select s from java.lang.String s where s.value.length >= 100
就可以查詢字符串長(zhǎng)度大于 100 的實(shí)例:
jstack
是堆棧跟蹤工具,主要用于打印給定進(jìn)程 pid 的堆棧信息,一般在發(fā)生死鎖或者 CPU 100% 的時(shí)候排查問(wèn)題使用,可以去查詢當(dāng)前運(yùn)行的線程以及線程的堆棧信息是什么情況,命令內(nèi)容如下:
下面執(zhí)行 jstack -F 8825 > jstack.log
命令,將線程的信息保存下來(lái):
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.161-b12 mixed mode):
"Attach Listener" #51805777 daemon prio=9 os_prio=0 tid=0x00007f971c001000 nid=0x9cd6 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"DestroyJavaVM" #55 prio=5 os_prio=0 tid=0x00007f9fc8009800 nid=0x227a waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"http-nio-8111-Acceptor-0" #52 daemon prio=5 os_prio=0 tid=0x00007f96c40c5800 nid=0x2653 runnable [0x00007f97c0df9000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
- locked <0x00007f982c6213c8> (a java.lang.Object)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:455)
at java.lang.Thread.run(Thread.java:748)
"http-nio-8111-ClientPoller-0" #50 daemon prio=5 os_prio=0 tid=0x00007f9fc8e7e000 nid=0x2651 runnable [0x00007f97c21fb000]
java.lang.Thread.State: RUNNABLE
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked <0x00007f982c622460> (a sun.nio.ch.Util$3)
- locked <0x00007f982c622450> (a java.util.Collections$UnmodifiableSet)
- locked <0x00007f982c622408> (a sun.nio.ch.EPollSelectorImpl)
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:787)
at java.lang.Thread.run(Thread.java:748)
"Service Thread" #17 daemon prio=9 os_prio=0 tid=0x00007f9fc8379000 nid=0x229d runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread10" #15 daemon prio=9 os_prio=0 tid=0x00007f9fc8373800 nid=0x229b waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"VM Thread" os_prio=0 tid=0x00007f9fc831c000 nid=0x228d runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f9fc801e800 nid=0x227b runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f9fc8020800 nid=0x227c runnable
"VM Periodic Task Thread" os_prio=0 tid=0x00007f9fc837e000 nid=0x229e waiting on condition
JNI global references: 357
因?yàn)閮?nèi)容比較多,截取了部分內(nèi)容,可以看出會(huì)打印出線程的信息、狀態(tài)以及堆棧,也會(huì)打印出 GC Task 的線程信息(ParallelGC 屬于并行收集器,默認(rèn)為 2 個(gè)線程),從中可以分析出每個(gè)線程都在做什么,如果服務(wù)器 CPU 占用高,可以看有多少個(gè)線程處于 RUNNABLE
狀態(tài),一般是由于處于 RUNNABLE
狀態(tài)的線程過(guò)多,導(dǎo)致 CPU 過(guò)高;如果很多線程處于 TIMED_WAITING
狀態(tài),理論上 CPU 占用不會(huì)很高。
感謝各位的閱讀,以上就是“有哪些JDK內(nèi)置命令”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)有哪些JDK內(nèi)置命令這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
分享名稱:有哪些JDK內(nèi)置命令
標(biāo)題網(wǎng)址:http://muchs.cn/article24/gjspce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、網(wǎng)站設(shè)計(jì)、響應(yīng)式網(wǎng)站、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)