當前位置:首頁 » 數據倉庫 » jvm怎麼配置
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

jvm怎麼配置

發布時間: 2023-06-10 22:45:19

㈠ 如何設置JVM參數

設置eclipse jvm參數

打開Eclipse 或者 MyEclipse

打開 Windows -> Preferences -> Java -> Installed JREs

在 Default VM Arguments輸入框內輸入: -Xms512m -Xmx512m

解釋:

-Xms是設置java虛擬機的最小分配內存;-Xmx則是最大分配內存;512m為內存空間

一般-Xmx設置為你電腦物理內存的1/4,而把-Xms和 -Xmx設置為一樣,

其實你可以設置得更大一些,只要系統能分配足夠的內存就可以了,如果設置過大系統會提示你的。

㈡ Linux裡面JVM內存怎麼設置

一、堆內存相關配置

設置堆初始值
指令1:-Xms2g
指令2:-XX:InitialHeapSize=2048m

設置堆區最大值
指令1:`-Xmx2g`
指令2: -XX:MaxHeapSize=2048m

縮小堆內存的時機
-XX:MaxHeapFreeRatio=70//堆內存使用率大於70時擴張堆內存,xms=xmx時該參數無效,默認值70

擴張堆內存的時機
-XX:MinHeapFreeRatio=40//堆內存使用率小於40時縮減堆內存,xms=xmx時該參數無效,默認值40

新生代內存配置
指令1:-Xmn512m
指令2:-XX:MaxNewSize=512m

2個survivor區和Eden區大小比率
指令:-XX:SurvivorRatio=6 //S區和Eden區佔新生代比率為1:6,兩個S區2:6

新生代和老年代的佔比
-XX:NewRatio=4 //表示新生代:老年代 = 1:4 即老年代占整個堆的4/5;默認值=2

二、方法區內存配置常用參數

初始化的Metaspace大小,
-XX:MetaspaceSize :

Metaspace最大值
-XX:MaxMetaspaceSize

三、線程棧內存配置常用參數
每個線程棧最大值
指令1:-Xss256k

指令2:-XX:ThreadStackSize=256k
注意:
棧設置太大,會導致線程創建減少。
棧設置小,會導致深入不夠,深度的遞歸會導致棧溢出。
建議棧深度設置在3000-5000
四、配置垃圾收集器
Serial垃圾收集器(新生代)
開啟:-XX:+UseSerialGC
關閉:-XX:-UseSerialGC
//新生代使用Serial 老年代則使用SerialOld
ParNew垃圾收集器(新生代)
開啟 -XX:+UseParNewGC
關閉 -XX:-UseParNewGC
//新生代使用功能ParNew 老年代則使用功能CMS
Parallel Scavenge收集器(新生代)
開啟 -XX:+UseParallelOldGC
關閉 -XX:-UseParallelOldGC
//新生代使用功能Parallel Scavenge 老年代將會使用Parallel Old收集器
ParallelOl垃圾收集器(老年代)
開啟 -XX:+UseParallelGC
關閉 -XX:-UseParallelGC
//新生代使用功能Parallel Scavenge 老年代將會使用Parallel Old收集器
CMS垃圾收集器(老年代)
開啟 -XX:+UseConcMarkSweepGC
關閉 -XX:-UseConcMarkSweepGC

G1垃圾收集器
開啟 -XX:+UseG1GC
關閉 -XX:-UseG1GC

五、GC策略配置
GC並行執行線程數
-XX:ParallelGCThreads=16
新生代可容納的最大對象
-XX:PretenureSizeThreshold=1000000 //大於此值的對象直接會分配到老年代,設置為0則沒有限制。 //避免在Eden區和Survivor區發生大量的內存復制,該參數只對Serial和ParNew收集器有效,Parallel Scavenge並不認識該參數
進入老年代的GC年齡
進入老年代最小的GC年齡
-XX:InitialTenuringThreshol=7 //年輕代對象轉換為老年代對象最小年齡值,默認值7,對象在堅持過一次Minor GC之後,年齡就加1,每個對象在堅持過一次Minor GC之後,年齡就增加1

進入老年代最大的GC年齡
-XX:MaxTenuringThreshold=15 //年輕代對象轉換為老年代對象最大年齡值,默認值15

六、GC日誌信息配置
配置GC文件路徑
-Xloggc:/data/gclog/gc.log//固定路徑名稱生成 -Xloggc:/home/GCEASY/gc-%t.log //根據時間生成
滾動生成日誌
日誌文件達到一定大小後,生成另一個文件。須配置Xloggc
開啟 -XX:+UseGCLogFileRotation
關閉 -XX:-UseGCLogFileRotation

-XX:NumberOfGCLogFiles=4 //滾動GC日誌文件數,默認0,不滾動 -XX:GCLogFileSize=100k //GC文件滾動大小,需配置UseGCLogFileRotation,設置為0表示僅通過jcmd命令觸發

㈢ JVM環境參數怎麼配置

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

-Xmx3550m:設置JVM最大可用內存為3550M。

-Xms3550m:設置JVM促使內存為3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。

-Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。

-Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。

java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所佔比值為1:4,年輕代占整個堆棧的1/5

-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6

-XX:MaxPermSize=16m:設置持久代大小為16m。

-XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。

㈣ jvm - 常用調優啟動參數配置

可以看到堆內存為2G,新生代為768M老年代為1280M,新生代採用ParNew收集器
-XX:+UseConcMarkSweepGC:新生代使用ParNew回收器,老年代使用CMS
線程棧為512k(默認1024k調小可以增加創建線程數,增加並發量)
同時列印 GC 詳細信息和列印 GC 發生時間,當發生OOM時,Dump文件到指定路徑

棧空間參數設置
-Xss: 設置線程的最大棧空間,棧空間越大,方法的遞歸深度越大

方法區參數設置(方法區大小的參數設置跟jdk版本相關)
jdk1.6,jdk1.7設置方法區永久代的大小
-XX:PermSize=5M
-XX:MaxPermSize=5M 最大永久代的大小默認是64M
jdk1.8及以上,永久代被移除,取而代之的是元數據區,元數據區是一塊堆外的直接內存
如果不指定大小,那麼會耗盡所有可用的系統內存
-XX:MaxMetaspaceSize=60M 設置最大元數據的大小

堆設置
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:設置新生代大小,設置較大的新生代大小會減小老年代大小,新生代的大小一般為堆空間的1/3
-XX:NewSize=n: 設置年輕代大小
-XX:NewRatio=n:設置年輕代和年老代的比值(老年代/新生代)。如:為3,表示年輕代與年老代比值為1:3
年輕代占整個年輕代年老代和的1/4
-XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。

-Xmn,-XX:NewSize/-XX:MaxNewSize,-XX:NewRatio 3組參數都可以影響年輕代的大小,混合使用的情況下,優先順序是什麼?

1.高優先順序:-XX:NewSize/-XX:MaxNewSize
2.中優先順序:-Xmn(默認等效 -Xmn=-XX:NewSize=-XX:MaxNewSize=?)
3.低優先順序:-XX:NewRatio
推薦使用-Xmn參數,原因是這個參數簡潔,相當於一次設定 NewSize/MaxNewSIze而且兩者相等,適用於生產環境。
-Xmn 配合 -Xms/-Xmx,即可將堆內存布局完成 -Xmn參數是在JDK 1.4 開始支持

下面兩個參數配合使用,當系統發生堆空間不足時,會導出整個堆的信息,且導出到指定的文件中去,後面用MAT工具分析
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=d:/a.mp
直接內存配置
-XX:MaxDirectMemorySize
設置直接內存大小,如果不設置,默認值為最大堆空間,即-Xmx指定的大小,當達到指定值時,
會觸發垃圾回收,如果回收後也無法釋放空間,那麼將會拋出OOM

-XX:+UseSerialGC:新生代,老年代都使用串列收集器
-XX:+UseParNewGC:新生代使用ParNew收集器,老年代使用串列收集器Serial
(jdk9,10已經廢除,因為ParNew只能和CMS收集器配合使用,而jdk9,10使用的默認收集器是G1)
-XX:+UseParallelGC:新生代使用ParallelGC,老年代使用串列收集器Serial

-XX:+UseParallelGC:新生代使用ParallelGC回收器,老年代使用串列回收器Serial
-XX:+UseParallelOldGC:新生代使用ParallelGC回收器,老年代使用ParallelOldGc回收器

兩個重要參數
-XX:MaxGCPasuseMillis:設置最大垃圾回收停頓時間,設置的過小,可能導致垃圾回收頻率加大
-XX:GCTimeRatio:設置吞吐量大小,取值范圍為0-100,系統回收垃圾的停頓時間花費不超過1/(1+n)%

設置線程數量
-XX:ParallelGCThreads

-XX:+UseConcMarkSweepGC:新生代使用ParNew回收器,老年代使用CMS
CMS默認啟動的並發線程數量為(parallelGCTheads+3)/4

設置並發線程數
-XX:ConcGCThreads=n
-XX:ParallelGCThreads=n

設置老年代空間使用率達到多少時執行CMS垃圾回收
-XX: 默認值為68

碎片整理參數,如果碎片不整理,可能造成沒達到閾值就會觸發老年代垃圾回收
-XX:+UseCMSCompactAtFullCollection :在CMS垃圾收集完成之後,進行一次內存碎片整理
-XX:+CMSFullGCsBeforeCompaction=n :在n次CMS回收後進行一次內存碎片整理

使用CMS回收方法去的perm區,默認情況下,還需要觸發一次FullGC
-XX:+CMSClassUnloadingEnabled

XX:UseG1GC 開啟G1垃圾收集器

兩個重要的參數
-XX:MaxGcPasuseMillis :指定目標最大停頓時間,如果停頓的時間過小,一次收集的區域數量也會變小
就會增加FullGC的可能

-XX:parallelGCThreads :設置並行回收的GC線程數量

-XX: :設置整個堆使用率達到多少時,觸發並發標記的執行,默認是45

-XX:+PrintGC 在程序運行期間,只要遇到GC,就會列印GC情況
佔用大小->gc後大小 GC消耗時間
jdk9,jdk10默認使用G1收集器,所以列印GC參數不同
-Xlog:gc

-XX:+PrintGCDetails 列印GC詳細信息(JDK8,9,10建議使用-Xlog:gc*)
-XX:+PrintGCTimeStamps 列印分析GC發生的時間
-XX:+ 列印應用程序的執行時間
-XX:+PrintGCApplicationStoppedTime 列印GC產生停頓的時間
-Xloggc:/usr/local/log/gc.log 讓gc日誌列印在log文件夾下的gc文件中,因為默認情況下gc日誌在控制台輸出

棧上分配,逃逸分析(方法內的變數被外部引用)
允許對象直接在棧上進行分配,隨線程停止而銷毀,這樣做可以加快分配速度,減少GC次數
棧空間較小,所以不適合大對象的棧上分配

-XX:+DoEscapeAnalysis 啟用逃逸分析
-XX:+EliminateAllocations 開啟標量替換(默認打開),允許對象打散分配在棧上
比如對象擁有id和name兩個欄位,那麼這兩個欄位將會被視為兩個獨立的變數進行分配。
對象晉升
-MaxTenuringThreshold=n ,當對象經歷了多少次GC次數後進入老年代
注意:大對象直接晉升到老年代
-PretenureSizeThreshold=n 這里的單位是位元組,新生對象大於這個值的時候,會直接分配到老年代

1、對存活對象標注時間過長:比如重載了Object類的Finalize方法,導致標注Final Reference耗時過長;或者String.intern方法使用不當,導致YGC掃描StringTable時間過長。

2、長周期對象積累過多:比如本地緩存使用不當,積累了太多存活對象;或者鎖競爭嚴重導致線程阻塞,局部變數的生命周期變長

當Eden區空間不足時,就會觸發YGC。結合新生代對象的內存分配看下詳細過程:

1、新對象會先嘗試在棧上分配,如果不行則嘗試在TLAB分配,否則再看是否滿足大對象條件要在老年代分配,最後才考慮在Eden區申請空間。

2、如果Eden區沒有合適的空間,則觸發YGC。

3、YGC時,對Eden區和From Survivor區的存活對象進行處理,如果滿足動態年齡判斷的條件或者To Survivor區空間不夠則直接進入老年代,如果老年代空間也不夠了,則會發生promotion failed,觸發老年代的回收。否則將存活對象復制到To Survivor區。

4、此時Eden區和From Survivor區的剩餘對象均為垃圾對象,可直接抹掉回收。

此外,老年代如果採用的是CMS回收器,為了減少CMS Remark階段的耗時,也有可能會觸發一次YGC,這里不作展開。

大多數情況下,對象直接在年輕代中的Eden區進行分配,如果Eden區域沒有足夠的空間,那麼就會觸發YGC(Minor GC),YGC處理的區域只有新生代。因為大部分對象在短時間內都是可收回掉的,因此YGC後只有極少數的對象能存活下來,而被移動到S0區(採用的是復制演算法)。當觸發下一次YGC時,會將Eden區和S0區的存活對象移動到S1區,同時清空Eden區和S0區。當再次觸發YGC時,這時候處理的區域就變成了Eden區和S1區(即S0和S1進行角色交換)。每經過一次YGC,存活對象的年齡就會加1。

下面4種情況,對象會進入到老年代中:

當晉升到老年代的對象大於了老年代的剩餘空間時,就會觸發FGC(Major GC),FGC處理的區域同時包括新生代和老年代。除此之外,還有以下4種情況也會觸發FGC: