JVM優化工具及jvm參數配置

1、堆設置

  • -Xms:堆內存的最小值
  • -Xmx:堆內存的最大值
  • -Xmn:堆內存中新生代的初始化大小
  • -XX:newSize:表示堆內存中新生代初始化的最小值,應該小於-Xms的值;
    -XX:MaxnewSize:表示堆內存中新生代初始化的最大值;當然這個值應該小於-Xmx的值;
    -Xmn:至於這個參數則是相當於對 -XX:newSize、-XX:MaxnewSize兩個參數的同時配置,也就是說如果通過-Xmn來配置新生代的內存大小,那麼-XX:newSize = -XX:MaxnewSize = -Xmn,雖然會很方便,但需要注意的是這個參數是在JDK1.4版本以後才使用的
    
  • -XX:NewRatio:設置新生代和老年代的比值。如:爲3,表示年輕代與老年代比值爲1:3
  • -XX:SurvivorRatio:新生代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:爲8,表示Eden:Survivor=8:2,一個Survivor區佔整個新生代的1/8
  • -XX:MaxTenuringThreshold:設置轉入老年代的存活次數。如果是0,則直接跳過新生代進入老年代

   棧設置

  • -Xss 設置每個線程可使用的內存大小,即棧的大小。在相同物理內存下,減小這個值能生成更多的線程,當然操作系統對一個進程內的線程數還是有限制的,不能無限生成。線程棧的大小是個雙刃劍,如果設置過小,可能會出現棧溢出,特別是在該線程內有遞歸、大的循環時出現溢出的可能性更大,如果該值設置過大,就有影響到創建棧的數量,如果是多線程的應用,就會出現內存溢出的錯誤。

   方法區

  • -XX:PermSize:表示非堆區(方法區)初始內存分配的最小值
  • -XX:MaxPermSize:表示對非堆區(方法區)分配的內存的最大值
  • -XX:MetaspaceSize、-XX:MaxMetaspaceSize:分別設置元空間最小大小與最大大小(Java8以後,以前叫做持久代並且佔用內存在堆裏,1.8之後在方法區中)

 


2、收集器設置

  • -XX:+UseSerialGC:設置串行收集器
  • -XX:+UseParallelGC:設置並行收集器
  • -XX:+UseParalledlOldGC:設置並行老年代收集器
  • -XX:+UseConcMarkSweepGC:設置併發收集器

3、垃圾回收統計信息

  • -XX:+PrintGC
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -Xloggc:filename


4、並行收集器設置

  • -XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。
  • -XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間
  • -XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)


5、併發收集器設置

  • -XX:+CMSIncrementalMode:設置爲增量模式。適用於單CPU情況。
  • -XX:ParallelGCThreads=n:設置併發收集器新生代收集方式爲並行收集時,使用的CPU數。並行收集線程數。

1、liunx上使用命令查看jvm各項參數

  • jps (JVM Process Status): 類似 UNIX 的 ps 命令。查看所有 Java 進程的啓動類、傳入參數和 Java 虛擬機參數等信息;
    • 用法:
    • jps -q :只輸出進程的本地虛擬機唯一 ID
    • jps -l    輸出主類的全名,如果進程執行的是 Jar 包,輸出 Jar 路徑。
    • jps -v:輸出虛擬機進程啓動時 JVM 參數。(經常使用,類似ps - ef |grep java 但比這個顯示更清晰)
    • jps -m:輸出傳遞給 Java 進程 main() 函數的參數。
  • .jstat命令:jstat 它可以顯示出虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據
    • jstat -class vmid :顯示 ClassLoader 的相關信息;
    • jstat -compiler vmid :顯示 JIT 編譯的相關信息;
    • jstat -gc vmid :顯示與 GC 相關的堆信息;
    • jstat -gccapacity vmid :顯示各個代的容量及使用情況;
    • jstat -gcnew vmid :顯示新生代信息;
    • jstat -gcnewcapcacity vmid :顯示新生代大小與使用情況;
    • jstat -gcold vmid :顯示老年代和永久代的信息;
    • jstat -gcoldcapacity vmid :顯示老年代的大小;
    • jstat -gcpermcapacity vmid :顯示永久代大小;
    • jstat -gcutil vmid :顯示垃圾收集信息;
    • 另外,加上 -t參數可以在輸出信息上加一個 Timestamp 列,顯示程序的運行時間。
    • 比如 jstat -gc -h3 31736 1000 10表示分析進程 id 爲 31736 的 gc 情況,每隔 1000ms 打印一次記錄,打印 10 次停止,每 3 行後打印指標頭部。
  • jstack主要用來查看某個Java進程內的線程堆棧信息,jstack可以定位到線程堆棧,根據堆棧信息我們可以定位到具體代碼。
    • 1、首先使用jps找到需要查看的進程pid
    • 2、接着找出該進程最消耗CPU的線程,可以使用top -Hp 26048或者ps -Lfp 26048來查看該進程中線程的cpu消耗情況
    • 3、查看到線程26094的消耗CPU時間是最長的,用命令查看該線程的十六進制值
    • [root@dzt-test-5-52 promotion-core]#  printf "%x\n" 26094
      65ee
      
      查詢到的值65ee用於下面jstack 定位信息(jstack 進程號|grep 65ee)
      
      [root@dzt-test-5-52 promotion-core]# jstack 26048|grep 65ee
      "redisson-netty-4-5" #34 prio=5 os_prio=0 tid=0x00007fa3462cd000 nid=0x65ee runnable [0x00007fa2e4bd7000]
      
      
      這樣就可以看到redisson-netty-4-5是最耗時的類,然後就可以去代碼審查代碼了。

  • 工具使用有jdk自帶的監控和管理控制檯JConsole和java VisualVM(安裝插件)這個也挺好用的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章