jvm診斷與優化(3)

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會自動根據系統選擇。

相關文章
相關標籤/搜索