91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有哪些JDK內置命令

發布時間:2021-11-02 14:09:07 來源:億速云 閱讀:126 作者:iii 欄目:編程語言

這篇文章主要講解了“有哪些JDK內置命令”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“有哪些JDK內置命令”吧!

javap

使用 javap 可以查看 Java 字節碼反編譯的源文件,javap 的命令格式如下:

有哪些JDK內置命令

下面來演示下用 javap -c 對代碼進行反編譯,首先寫個 HelloWorld 類,如下:

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

接著使用 javap -c HelloWorld.class 就可以反編譯得到如下結果:

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

jps 是用來查詢當前所有進程 pid 的,命令的用法如下圖所示:

有哪些JDK內置命令

執行 jps 可以獲取本機 Java 程序的 pid,運行結果如下:

[root@wupx ~]# jps
8825 spring-boot-0.0.1-SNAPSHOT.jar

使用 jps -mlvV 可以獲取到這個進程的 pid、jar 包的名字以及 JVM 參數等。

[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

jstat 主要用于監控 JVM,主要是 GC 信息,在性能優化的時候經常用到,命令內容如下所示:

有哪些JDK內置命令

比如,上面我們通過 jps 查到的進程號 8825,我們使用 jstat -gc 8825 來查看該進程的 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 表示當前 Survivor0 的容量,S1C 表示當前 Survivor1 的容量,S0U 表示當前 Survivor0 的利用率,S1U 表示當前 Survivor1 的利用率,EC 表示 Eden 的容量,EU 表示 Eden 的利用率,OC 表示老年代的容量,OU 表示老年代的利用率,MC 表示 Metaspace 的容量,MU 表示 Metaspace 的利用率,CCSC 表示類指針壓縮空間容量,CCSU 表示使用的類指針壓縮空間,YGC 表示新生代 GC 的次數,YGCT 表示新生代 GC 的時間,FGC 表示 Full Gc 的次數,FGCT 表示 Full GC 的時間,GCT 表示 GC 總時間。

每個對象都有一個指向它自身類的指針,_klass: 指向類的 4 字節指針,64 位平臺上 _klass: 指向類的 8 字節的指針,為了節約這些空間,引入了類指針壓縮空間。

jcmd

jcmd 可以查看 JVM 信息,常用的命令內容如下:

有哪些JDK內置命令

先使用 jcmd 8825 help 來查看都支持什么命令:

[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

下面我就選一個參數給大家舉個例子,比如打印堆的信息,使用 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

jmap 打印出 Java 進程內存中 Object 的情況,或者將 JVM 中的堆以二進制輸出成文本,命令內容如下:

有哪些JDK內置命令

使用 jmap -heap 8825 查看當前堆的使用信息:

[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.

首先會打印堆的一些相關配置,比如最大新生代、元空間的大小等;下面為堆的使用情況,包括新生代的 Eden 區、S0 區、S1 區以及老年代。

jmap 還可以將堆的信息以文件的形式保存下來,相當于文件快照,執行 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

這個 heap.bin 可以使用 jhat 命令打開,是以 html 的形式展示的。

jhat

jhat 分析 Java 堆的命令,可以將堆中對象以 html 的形式顯示出來,支持對象查詢語言 OQL,命令內容如下:

有哪些JDK內置命令

現在執行 jhat -port 9999 heap.bin 來將剛剛保存的 heap.bin 以 html 展示出來:

[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.

執行完畢后,打開 http://localhost:9999/ 就可以看到類的實例的堆占用情況,它是按照包名來分組的:

有哪些JDK內置命令

網頁的底部還有許多 Query 方式:

有哪些JDK內置命令

下面以 OQL 為例,打開后是一個類似 SQL 查詢的窗口,比如輸入 select s from java.lang.String s where s.value.length >= 100 就可以查詢字符串長度大于 100 的實例:

有哪些JDK內置命令

jstack

jstack 是堆棧跟蹤工具,主要用于打印給定進程 pid 的堆棧信息,一般在發生死鎖或者 CPU 100% 的時候排查問題使用,可以去查詢當前運行的線程以及線程的堆棧信息是什么情況,命令內容如下:

有哪些JDK內置命令

下面執行 jstack -F 8825 > jstack.log 命令,將線程的信息保存下來:

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

因為內容比較多,截取了部分內容,可以看出會打印出線程的信息、狀態以及堆棧,也會打印出 GC Task 的線程信息(ParallelGC 屬于并行收集器,默認為 2 個線程),從中可以分析出每個線程都在做什么,如果服務器 CPU 占用高,可以看有多少個線程處于 RUNNABLE 狀態,一般是由于處于 RUNNABLE 狀態的線程過多,導致 CPU 過高;如果很多線程處于 TIMED_WAITING 狀態,理論上 CPU 占用不會很高。

感謝各位的閱讀,以上就是“有哪些JDK內置命令”的內容了,經過本文的學習后,相信大家對有哪些JDK內置命令這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jdk
AI

泽库县| 乐陵市| 县级市| 上栗县| 资源县| 略阳县| 永靖县| 晋宁县| 大新县| 余姚市| 泾阳县| 灌阳县| 灯塔市| 平乡县| 蒲江县| 互助| 恩平市| 长宁区| 松潘县| 信丰县| 鲜城| 绍兴市| 景洪市| 吕梁市| 邵阳市| 巴南区| 钟山县| 芒康县| 潞西市| 汉源县| 四川省| 栾川县| 吴江市| 法库县| 沙湾县| 和硕县| 玛曲县| 邵东县| 盐山县| 会泽县| 溧阳市|