jvm內存:如圖從左到右依次爲: java
[ (新生代)PSYoungGen:{ Eden\S0(form)\S1(to) } \ (老年代)ParOldGen:{ Old Memory} ] \ (方法區\持久區)Perm shell
-Xms120M 設置堆的初始大小120M jvm
-Xmx120M 設置堆最大的空間120M;實際最大的可用空間會比設定值小些;丟失的大小等於from/to空間; 工具
也就是說 最大可用空間 = Xmx值 - from/to值,少去的那部分是新生代的空間。 性能
參數說明: jvm空間會盡可能保持在初始大小(-Xms),除非有必要擴展堆空間,但最大不超過設定的最大小值(-Xms) 。 ui
最好讓初始值與最大值一致。減小GC觸發的次數,提升性能 spa
-Xmn40M 設置新生代的大小40M(Eden+S0+S1).設置一個較大的新生代會減少老年代的大小。通常配置 線程
新生代的大小爲整個堆空間的1/3 到 1/4 code
-XX:SurvivorRatio = eden/from 用來設置新生代中eden空間和s0空間的比例 orm
例 java -Xmx12M -Xms12M -Xmn4M -XX:SurvivorRatio=2 -XX:+PrintGCDetails jvm.Test 0
PSYoungGen total 3072K, used 716K [0x00000000ffc00000, 0x0000000100000000, 0x0000000100000000) eden space 2048K, 34% used [0x00000000ffc00000,0x00000000ffcb32e0,0x00000000ffe00000) from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) ParOldGen total 8192K, used 0K [0x00000000ff400000, 0x00000000ffc00000, 0x00000000ffc00000) object space 8192K, 0% used [0x00000000ff400000,0x00000000ff400000,0x00000000ffc00000) PSPermGen total 21504K, used 2549K [0x00000000fa200000, 0x00000000fb700000, 0x00000000ff400000) object space 21504K, 11% used [0x00000000fa200000,0x00000000fa47d570,0x00000000fb700000)
輸出說明: 新生代的最大可用空間 = Xmn值 - from/to值 = 4M - 1024K = 3072K
新生代最大空間 = eden+s0(from)+s1(to) = 2048K+ 1024K +1024K = 4M
老年代的最大可用空間 = Xmx值 - Xmn值 = 12M - 4M = 8192K
堆最大可用空間 = Xmx值 - from/to值 = 12M - 1024K = 11M
-XX:NewRatio = 老年代/新生代 //配置老年代與新生代的比例
參數說明:新生代與老年代空間大小的分配對GC行爲有很大的影響,儘量將對象預留在新生代,減小老年代GC次數
---------------------------------------------------------------------------------------
jvm 的非堆內存有 持久區、棧空間 和 直接空間 (jvm也能夠直接用系統空間)
-XX:PermSize50M 和 -XX:MaxPerSize50M 配置持久區的初始空間與最大空間50MB(jdk6 jdk7)
提示:jdk8中持久區已經算到系統空間中了,即系統內存有多少它就能用多少不受限。但依然可用-XX:MaxMetaspaceSize指定最大使用空間
-Xss10M 指定線程最大棧空間爲10MB(說明見1章)
-XX:MaxDirectMemorySize 最大可以使用的直接內存空間,默認爲Xmx值
參數說明:當前直接內存達到最大值時GC就會回收。如不能回收仍是會發生內存溢出,直接內存的讀寫速度會比堆內存快40%,
但申請內存空間這方面對堆內存操做的速度遠遠高於直接內存。因此直接內存適合申請次數少訪問頻繁的場合。
-----------------------------------------------------------------------------------------
當程序運行空間超過jvm的內存就是拋出OutOfMemoryError異常,即OOM
package jvm; import java.util.ArrayList; import java.util.List; public class Test2 { public static void main(String[] args) { List<Object> container = new ArrayList<Object>(); int length = Integer.parseInt(args[0]); for (int i = 0; i < length; i++) { container.add(new byte[1*1024*1024]); } } }
-XX:+HeapDumpOnOutOfMemoryError 在內存溢出時導出整個堆的信息
-XX:HeapDumpPath 指定導出堆的存放路徑,配合HeapDumpOnOutOfMemoryError 使用
例 java -Xmx20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:/a.dump jvm.Test2 30
java.lang.OutOfMemoryError: Java heap space Dumping heap to E:/a.dump ... Heap dump file created [18974861 bytes in 0.061 secs] Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at jvm.Test2.main(Test2.java:11)a.dump 這個文件能夠使用MAT工具打開
-XX:OnOutOfMemoryError 在發生溢出錯誤時執行一個腳本文件,用於自救,通知等
例: java -Xmx20M "-XX::OnOutOfMemoryError=E:/printstack.bat %p" -XX:+HeapDumpOnOutOfMemoryError jvm.Test2 30
----------------------------------------------------------------------------------------------
最後虛擬機的工做模式 Client 和 Server
-client 指定client 工做模式
-server 指定server 工做模式;啓動慢但執行速度遠快於client模式。通常都是server模式工做的
java -version 查看當前模式
java -version java version "1.7.0_75" Java(TM) SE Runtime Environment (build 1.7.0_75-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode) //當前爲server模式
參數說明:默認狀況下jvm會自動根據系統選擇。