分享一些常用得jvm調(diào)優(yōu)關(guān)鍵字

1.1堆的內(nèi)存分配用

-Xms和-Xmx 初始堆和最大堆設(shè)置。

Java 虛擬機(jī)具有一個堆(Heap),堆是運(yùn)行時數(shù)據(jù)區(qū)域,所有類實(shí)例和數(shù)組的內(nèi)存均從此處分配。堆是在 Java 虛擬機(jī)啟動時創(chuàng)建的,在JVM中堆之外的內(nèi)存稱為非堆內(nèi)存(Non-heap memory)。

簡單的說就是:堆是java代碼可及的內(nèi)存,開發(fā)人員寫的東西都是堆分配的內(nèi)存(底層實(shí)現(xiàn)除外)。而非堆內(nèi)存則是JVM自己用的,比如JVM內(nèi)部處理或優(yōu)化,垃圾處理,常數(shù)池等。

-Xms分配堆最小內(nèi)存,默認(rèn)為物理內(nèi)存的1/64;-Xmx分配最大內(nèi)存,默認(rèn)為物理內(nèi)存的1/4。

-Xmn 堆新生代的大小

設(shè)置較大會影響老年代的大小,這個參數(shù)對GC性能有比較大的影響,一般設(shè)置為堆空間的1/3或1/4.

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

1.2非堆內(nèi)存

-Xss 棧大小

方法區(qū)配置

主要存放類的元數(shù)據(jù)
配用-XX:PermSize和-XX:MaxPermSize 永久代

-XX:PermSize分配非堆最小內(nèi)存,默認(rèn)為物理內(nèi)存的1/64;-XX:MaxPermSize分配最大內(nèi)存,默認(rèn)為物理內(nèi)存的1/4。
(當(dāng)然對于以上兩種,我們還需要知道,一般實(shí)際物理內(nèi)存是不會按照最大得提供給我們的,一般linux系統(tǒng)限制是在3-4G,window是1.5-2G)網(wǎng)上的說法,我找了很多是這樣說,如果有確切的新數(shù)據(jù),我在更新。

直接內(nèi)存配置

直接內(nèi)存跳過了java堆,使java程序可以直接訪問原生堆空間,
可以用-XX:MaxDirectMemorySize設(shè)置。如果不設(shè)置,默認(rèn)為最大堆空間 -Xmx。當(dāng)直接內(nèi)存使用達(dá)到MaxDirectMemorySize時,會觸發(fā)垃圾回收,如果垃圾回收還不夠,會拋OOM異常。

正常情況直接內(nèi)存會快于堆內(nèi)存。

怎么配置: 直接內(nèi)存訪問效率高于堆內(nèi)存,但是申請空間的速度遠(yuǎn)遠(yuǎn)低于堆內(nèi)存。
所以,適合申請次數(shù)較少,訪問比較頻繁的場景。

2.OmitStackTraceInFastThrow

這是HotSpot VM專門針對異常做的一個優(yōu)化,稱為fast throw,當(dāng)一些異常在代碼里某個特定位置被拋出很多次的話,HotSpot Server Compiler(C2)會用fast throw來優(yōu)化這個拋出異常的地方,直接拋出一個事先分配好的、類型匹配的對象,這個對象的message和stack trace都被清空。
可以明確:拋出這個異常非??欤挥妙~外分配內(nèi)存,也不用爬棧。
副作用:正好是需要知道哪里出問題的時候看不到stack trace了,不利于排查問題。
如果遇到?jīng)]有stack trace的問題可考慮通過 -XX:-OmitStackTraceInFastThrow 禁用該默認(rèn)的優(yōu)化。

3.-XX:+HeapDumpOnOutOfMemoryError

在JAVA_OPTIONS變量中增加

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

2、參數(shù)說明
(1)-XX:+HeapDumpOnOutOfMemoryError參數(shù)表示當(dāng)JVM發(fā)生OOM時,自動生成DUMP文件。
(2)-XX:HeapDumpPath={目錄}參數(shù)表示生成DUMP文件的路徑,也可以指定文件名稱,例如:-XX:HeapDumpPath={目錄}/java_heapdump.hprof。如果不指定文件名,默認(rèn)為:java_<pid><date><time>_heapDump.hprof。然后可以通過dump文件打開去分析問題。

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

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

如圖:

image

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

5.-XX:+PrintGCApplicationStoppedTime 可以打印應(yīng)用程序由于GC產(chǎn)生的停頓時間。

類加載\卸載跟蹤

一般而言,java程序允許離不開類的加載,所以為了更好理解運(yùn)行需要知道加載了那些類,又由于現(xiàn)在很多動態(tài)代理、AOP技術(shù)存在,無法直接找到那些類加載。

可以直接使用參數(shù) -verbose:class跟蹤類的加載和卸載。也可以單獨(dú)使用參數(shù): -XX:+TraceClassLoading

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

系統(tǒng)參數(shù)查看

-XX:PrintVMOptions可以在程序運(yùn)行時,打印虛擬機(jī)接收到的命令行顯示參數(shù)。其輸出如下:

image

說明啟動虛擬機(jī)時,指定如下參數(shù)。

-XX:PrintCommandLineFlags 打印傳遞給虛擬機(jī)啟動時的顯式和隱式參數(shù)。隱式未必通過命令給出,可能時自行配置的,

-XX:+PrintFlagsFinal 會打印虛擬機(jī)所有的系統(tǒng)參數(shù)的值。??梢杂糜趯W(xué)習(xí)。

還有以下一些常用的:

```xml
 * -verbose:gc   報(bào)告每個垃圾收集事件,穩(wěn)定版本,
 * 用于垃圾收集的信息收集
 * -XX:+PrintGC非穩(wěn)定版本,可能在未通知的情況下刪除,
 * 在下面官方文檔中是-XX:-PrintGC。
 * 因?yàn)楸粯?biāo)記為manageable,所以可以通過如下三種方式修改:
 * 1、com.sun.management.HotSpotDiagnosticMXBean API
 * 2、JConsole
 * 3、jinfo -flag  

 * -Xms20m    設(shè)置堆最小為20M
 * -Xmx20m     設(shè)置堆最大為20M
將堆最大值與最小值設(shè)置為一樣,可避免堆自動擴(kuò)展

  * -XX:+HeapDumpOnOutOfMemoryError參數(shù)表示當(dāng)JVM發(fā)生OOM時,
 * 自動生成DUMP文件。

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

待續(xù)更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容