分享一些經常使用得jvm調優關鍵字

1.1堆的內存分配用

-Xms和-Xmx 初始堆和最大堆設置。

Java 虛擬機具備一個堆(Heap),堆是運行時數據區域,全部類實例和數組的內存均今後處分配。堆是在 Java 虛擬機啓動時建立的,在JVM中堆以外的內存稱爲非堆內存(Non-heap memory)。java

簡單的說就是:堆是java代碼可及的內存,開發人員寫的東西都是堆分配的內存(底層實現除外)。而非堆內存則是JVM本身用的,好比JVM內部處理或優化,垃圾處理,常數池等。linux

-Xms分配堆最小內存,默認爲物理內存的1/64;-Xmx分配最大內存,默認爲物理內存的1/4。數組

-Xmn 堆新生代的大小

設置較大會影響老年代的大小,這個參數對GC性能有比較大的影響,通常設置爲堆空間的1/3或1/4.bash

-XX:NewRatio=老年代/新生代比例

1.2非堆內存

-Xss 棧大小

方法區配置

主要存放類的元數據 配用-XX:PermSize和-XX:MaxPermSize 永久代性能

-XX:PermSize分配非堆最小內存,默認爲物理內存的1/64;-XX:MaxPermSize分配最大內存,默認爲物理內存的1/4。 (固然對於以上兩種,咱們還須要知道,通常實際物理內存是不會按照最大得提供給咱們的,通常linux系統限制是在3-4G,window是1.5-2G)網上的說法,我找了不少是這樣說,若是有確切的新數據,我在更新。學習

直接內存配置

直接內存跳過了java堆,使java程序能夠直接訪問原生堆空間, 能夠用-XX:MaxDirectMemorySize設置。若是不設置,默認爲最大堆空間 -Xmx。當直接內存使用達到MaxDirectMemorySize時,會觸發垃圾回收,若是垃圾回收還不夠,會拋OOM異常。優化

正常狀況直接內存會快於堆內存。spa

怎麼配置: 直接內存訪問效率高於堆內存,可是申請空間的速度遠遠低於堆內存。 因此,適合申請次數較少,訪問比較頻繁的場景。命令行

2.OmitStackTraceInFastThrow

這是HotSpot VM專門針對異常作的一個優化,稱爲fast throw,當一些異常在代碼裏某個特定位置被拋出不少次的話,HotSpot Server Compiler(C2)會用fast throw來優化這個拋出異常的地方,直接拋出一個事先分配好的、類型匹配的對象,這個對象的message和stack trace都被清空。 能夠明確:拋出這個異常很是快,不用額外分配內存,也不用爬棧。 反作用:正好是須要知道哪裏出問題的時候看不到stack trace了,不利於排查問題。 若是遇到沒有stack trace的問題可考慮經過 -XX:-OmitStackTraceInFastThrow 禁用該默認的優化。代理

3.-XX:+HeapDumpOnOutOfMemoryError

在JAVA_OPTIONS變量中增長

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目錄}。 例如:export JAVA_OPTS="-Xms2048M -Xmx2048M -Xmn682M -XX:MaxPermSize=96M"

二、參數說明 (1)-XX:+HeapDumpOnOutOfMemoryError參數表示當JVM發生OOM時,自動生成DUMP文件。 (2)-XX:HeapDumpPath={目錄}參數表示生成DUMP文件的路徑,也能夠指定文件名稱,例如:-XX:HeapDumpPath={目錄}/java_heapdump.hprof。若是不指定文件名,默認爲:java_

4.-XX:+PrintGC與-XX:+PrintGCDetails 與 -XX:+PrintHeapAtGC

-XX:+PrintGCDetails 控制檯打印GC日誌詳情包含-XX:+PrintGC

如圖:

推薦使用最後一個-XX:+PrintHeapAtGC,會在每次堆先後分別打印堆的信息。

5.-XX:+PrintGCApplicationStoppedTime 能夠打印應用程序因爲GC產生的停頓時間。

類加載\卸載跟蹤

通常而言,java程序容許離不開類的加載,因此爲了更好理解運行須要知道加載了那些類,又因爲如今不少動態代理、AOP技術存在,沒法直接找到那些類加載。

能夠直接使用參數 -verbose:class跟蹤類的加載和卸載。也能夠單獨使用參數: -XX:+TraceClassLoading

跟蹤加載,使用 -XX:TraceClassUnloading跟蹤類的卸載。

系統參數查看

-XX:PrintVMOptions能夠在程序運行時,打印虛擬機接收到的命令行顯示參數。其輸出以下:

說明啓動虛擬機時,指定以下參數。

-XX:PrintCommandLineFlags 打印傳遞給虛擬機啓動時的顯式和隱式參數。隱式未必經過命令給出,可能時自行配置的,

-XX:+PrintFlagsFinal 會打印虛擬機全部的系統參數的值。。能夠用於學習。

還有如下一些經常使用的:

```xml
 * -verbose:gc   報告每一個垃圾收集事件,穩定版本,
 * 用於垃圾收集的信息收集
 * -XX:+PrintGC非穩定版本,可能在未通知的狀況下刪除,
 * 在下面官方文檔中是-XX:-PrintGC。
 * 由於被標記爲manageable,因此能夠經過以下三種方式修改:
 * 一、com.sun.management.HotSpotDiagnosticMXBean API
 * 二、JConsole
 * 三、jinfo -flag  

 * -Xms20m    設置堆最小爲20M
 * -Xmx20m     設置堆最大爲20M
將堆最大值與最小值設置爲同樣,可避免堆自動擴展

  * -XX:+HeapDumpOnOutOfMemoryError參數表示當JVM發生OOM時,
 * 自動生成DUMP文件。

 * -XX:HeapDumpPath=${目錄}  參數表示生成DUMP文件的路徑,
 *                           也能夠指定文件名稱
 * -XX:SurvivorRatio=8 設置兩個Survivor區和eden的比,
 * 8表示兩個Survivor:eden=2:8即一個Survivor佔年輕代的1/10
  * -Xss128k 棧容量只由-Xss參數設定
  * -XX:PermSize和-XX:MaxPermSize限制方法區大小,從而間接限制其中常量池的容量
複製代碼

待續更新

相關文章
相關標籤/搜索