java應用程序可使用的最大堆內存可使用-Xmx 參數指定,最大堆內存是新生代和年老年代之和的最大值。java
下面代碼演示在java虛擬機被設定了最大堆內存以後,建立不能被回收的java對象,會發生「java.lang.OutOfMemoryError: Java heap space」異常。數組
設定參數:-Xmx5M服務器
public static void main(String[] args) { Vector v = new Vector(); for (int i=1;i<=10;i++){ byte[] b = new byte[1024*1024];//給次循環佔用1M空間 v.add(b);//強引用,不會被GC回收 System.out.println(i+"M is allocated"); } System.out.println("Max memory :"+Runtime.getRuntime().maxMemory()/1024/1024+"M");//系統可用最大內存 }
運行結果spa
1M is allocated
2M is allocated
3M is allocated
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space操作系統
由於堆內存最大值爲5M,在被佔用了3M以後,剩餘的空閒內存已經不夠1M了,因此會發生內存溢出錯誤。線程
設定參數:-Xmx15M 運行結果說明最大堆內存爲15M時,知足建立10個1M大小的數組。對象
1M is allocated
2M is allocated
3M is allocated
4M is allocated
5M is allocated
6M is allocated
7M is allocated
8M is allocated
9M is allocated
10M is allocated
Max memory :15M內存
使用JVM參數-Xms能夠設置系統最小堆空間。java應用程序在運行時,首先會被分配-Xms指定的內存大小,並儘量嘗試在這個空間段內運行,當-Xms指定的內存實在沒法知足程序運行時,JVM纔會向操做系統申請更多的內存,直到內存大小達到-Xmx指定的值。若超過-Xmx的值則拋出OutOfMemoryError。get
當參數-Xms設置太小時,JVM爲了保證系統儘量在該空間範圍內運行,就會更加頻繁地進行GC操做,這樣就會對系統產生必定的影響。虛擬機
代碼演示-Xms堆內存設置對GC頻次的影響
public static void main(String[] args){ Vector v = new Vector(); for (int i=1;i<=10;i++){ byte[] b = new byte[1024*1024];//給次循環佔用1M空間 v.add(b);//強引用,不會被GC回收 if(v.size() == 3){ System.out.println("累計3M時清空內存"); v.clear();//清除引用,GC能夠對沒有引用的對象回收 } } }
參數:-Xmx11m -Xms4m -verbose:gc,系統進行4次GC,1次Full GC,如下運行結果
[GC (Allocation Failure) 505K->504K(3584K), 0.0011018 secs]
[GC (Allocation Failure) 1016K->648K(3584K), 0.0125823 secs]
累計3M時清空內存
累計3M時清空內存
[GC (Allocation Failure) 7925K->7872K(9216K), 0.0039725 secs]
[GC (Allocation Failure) 7872K->7872K(9728K), 0.0010522 secs]
[Full GC (Allocation Failure) 7872K->1649K(4608K), 0.0225880 secs]
累計3M時清空內存
參數:-Xmx11m -Xms11m -verbose:gc,系統進行5次GC,0次Full GC,如下運行結果
[GC (Allocation Failure) 2272K->1672K(11776K), 0.0013209 secs]
累計3M時清空內存
[GC (Allocation Failure) 3809K->1704K(11776K), 0.0009657 secs]
[GC (Allocation Failure) 3820K->3784K(11776K), 0.0012901 secs]
累計3M時清空內存
[GC (Allocation Failure) 5897K->4808K(11776K), 0.0010995 secs]
累計3M時清空內存
[GC (Allocation Failure) 6919K->4808K(11776K), 0.0007631 secs]
注意:JVM會試圖將系統儘量限制在-Xms中,所以當實際佔用內存接近-Xms時就會觸發Full GC。
參數-Xmn用於設置新生代空間大小,當新生代設置較大時老年代空間就會相應的減少,因此這個參數的設置對系統新能和GC行爲有很大影響,新生代的大小通常爲整個堆內存的1/4到1/3左右。
在Hot Spot虛擬機中,-XX:NewSize用於設置新生代初始大小,-XX:MaxNewSize用於設置新生代最大值。一般狀況下-Xmn已經能夠知足咱們絕大多說須要,設置-Xmn效果就等於設置了相同的-XX:NewSize和-XX:MaxNewSize,若設置不一樣的-XX:MaxNewSize和-XX:NewSize反而會致使內存震盪。
在JDK6版本中:
--XX:PermSize:設置持久帶初始大小
XX:MaxPermSize:設置持久帶最大值
JDK8版本中:
默認狀況下元空間大小受本地內存大小影響,也能夠經過參數指定元空間大小。
-XX:MetaspaceSize,初始空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:若是釋放了大量的空間,就適當下降該值;若是釋放了不多的空間,那麼在不超過MaxMetaspaceSize時,適當提升該值。
-XX:MaxMetaspaceSize,最大空間,默認是沒有限制的。
線程棧是線程執行時開闢的一塊獨立內存空間。
例如配置:-Xss1M,表示設置每一個線程擁有1M的棧空間,在本機計算機上能夠開1803個線程,當修改-Xss20M時在本機計算機上只能開81個線程了。
若是指定了最大堆內存,則會發現系統所能支持的線程數與堆內存還有關係,服務器本地內存必定的狀況下,堆內存佔用越大,相應的線程棧所能佔用的內存就會變小。
生產上面更多的是但願對堆空間進行比例分配。
-XX:SurvivorRatio是用來設置新生代中eden區和s0空間的比例關係。s0和s1空間大小是相同的,並在MinorGC後,會互換角色。
-XX:SurvivorRatio = eden/s0=eden/s1
如-Xmn10M -XX:SurvivorRatio=8,則表示eden =8M,s0=1M,s1=1M.
如-Xmn10M -XX:SurvivorRatio=2,則表示eden=5M,s0=2.5M,s1=2.5M
-XX:NewRatio用來設置新生代和老年代比例
-XX:NewRatio=老年代/新生代
如-Xms20M -Xmx20M -XXNewRatio=2,則表示 新生代=6.6M 老年代=13.3M。
-Xms:設置初始堆大小。
-Xmx:設置最大堆大小。
-Xss:設置線程棧大小。
-XX:NewSize:設置新生代大小。
-XX:SurvivorRatio:設置eden/s0比例。
-XX:TargetSurvivorRatio:設置survivor區可以使用率,當survivor區的空間使用率達到這個值時會將對象送入老年代。
-XX:NewRatio:設置老年代/新生代比例。
-XX:MetaspaceSize:設置初始元空間大小。
-XX:MaxMetaspaceSize:設置最大元空間大小。