設置步驟(idea下)
- 很簡單,直接看圖吧,點這裏
修改VM options參數即可
設置參數記錄
常用參數分配
- -Xmx:最大堆內存,也就是新生代和老年代的大小之和的最大值,代碼
Runtime.getRuntime().maxMemory()
可以獲得最大堆內存大小(比如:-Xmx20M)
- -Xms:最小堆內存,程序在運行時,首先會被分配的大小,如果設置過小,可能導致更加頻繁的GC操作,不利於系統的性能優化
- Xmn:設置新生代大小,新生代如果過大,會影響老年代的大小。一把設置爲堆空間的41 到 31左右(-XX:NewSize和-XX:MaxNewSize也是設置新生代,但是建議使用Xmn)
- -XX:PermSize、-XX:MaxPermSize:永久空間大小,JDK8之前設置永久區大小的方法,JDK8之後已經沒有永久區了,自然也設置不了
- -Xss:線程棧的大小,如果過大,相應的能設置的線程數就會變少,如果過小,局部變量或者函數的調用深度就會表少,
- -XX:+PrintGCDetails : 打印GC的信息
空間比例分配
- -XX:SurvivorRatio=8 : 表示新生代中eden是s0空間的8倍,而s0等與s1(舉例:新生代總共10M,eden就爲8M,而S0、S1分別個1M)
- -XX:NewRatio=2:表示老年代是新生代的2倍(舉例:堆爲21M,那麼老年代就是14M,新生代就是6M)
堆參數相關配置
- -XX:MinHeapFree:設置堆最小的空閒比列。當堆空間的空閒內存小於這個數值時,JVM便會擴展堆空間。
- -XX:MaxHeapFree:設置堆最大的空閒比列。當堆空間的空閒內存大於這個數值時,JVM便會壓縮堆空間。
- -XX:TargetSurvivorRatio:設置survivior(倖存者,新生代中第二階段)區的可使用率。當survivior區的空間使用率達到這個數值時,會將對象送入老年代。
- -XX:PretenureSizeThreshold:設置大對象直接進入老年代的閾值。當大對象的大小超過這個值時,將直接在老年代分配。
- -XX:MaxTenuringThreshold:設置對象進入老年代的年齡的最大值。每次GC後,對象年齡就加1.任何大於這個年齡的對象,一定會進入老年代
垃圾收集器設置
- -XX:+UseSerialGC : 參數可以指定使用新生代串行收集器和老年代串行收集器
- -XX:UseParNewGC : 新生代使用並行收集器,可與CMS收集同時使用。在serial基礎上實現的多線程收集器
- -XX:UseParallelGC : 新生代使用並行收集器。可以同時並行多個垃圾收集線程,但此時用戶線程必須停止。
- -XX:UseConcMarkSweepGC:新生代使用並行收集器
- -XX:ParallelGCThreads:並行收集器的線程數參數指定
- -XX:UseParallelOldGC:設置新生代爲並行回收收集器
- -XX:+UseAdaptiveSizePolicy設置並行收集器爲自適應GC策略,系統可以自動配置最大堆、吞吐量和停頓時間的平衡
- -XX:+UseParallelOldGC : 設置新生代和老年代都使用並行回收收集器
- -XX:ParallelCMSThreads:手動的設定CMS的線程數量
- -XX:CMSInitiatingOccupancyFraction:指定CMS的回收閥值,默認是68,即老年代閾值達到68%時,就開始回收
- -XX:UseCMSCompactAtFullCollection:設置CMS是否開啓碎片整理
- -XX:CMSFullGCsBeforeCompaction:設置多少次CMS後進行碎片整理
- -XX:unlockExperimentalVMOptions -XX:+UseG1GC:啓用G1回收器
- -XX:+TraceClassLoading:打印類的加載信息
- -XX:+TraceClassUnloading:打印類的卸載信息
- -XX:+PrintClassHistogram:打印運行時,實例的信息。當Ctrl + Pause Break被按下(idea情況下,選中信息輸出窗口),會輸出系統內類的統計信息
- -XX:DisableExplicitGC:禁止手動觸發GC,也就是System.gc()失效
- -XX:Xnoclassgc:禁止類卸載,也就是System.gc()失效
相關的異常信息
- 如果堆內存過大,可能會導致計算機內存不夠,從而不能新建線程,報錯如下
java.lang.OutOfMemoryError:unable to create new native thread
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Java heap space