jvm诊断与优化(3)
2019獨角獸企業重金招聘Python工程師標準>>>
jvm內存:如圖從左到右依次為:
[ (新生代)PSYoungGen:{?Eden\S0(form)\S1(to) } \ (老年代)ParOldGen:{?Old Memory} ] \?(方法區\持久區)Perm?
-Xms120M ? ?設置堆的初始大小120M
-Xmx120M ? ?設置堆最大的空間120M;實際最大的可用空間會比設定值小些;丟失的大小等于from/to空間;
? ? ? ? ? ? ? ? ? ? ? ? ?也就是說 最大可用空間 = Xmx值 - from/to值,少去的那部分是新生代的空間。
參數說明: ?jvm空間會盡量保持在初始大小(-Xms),除非有必要擴展堆空間,但最大不超過設定的最大小值(-Xms) 。
最好讓初始值與最大值一致。減少GC觸發的次數,提高性能
-Xmn40M ?設置新生代的大小40M(Eden+S0+S1).設置一個較大的新生代會減小老年代的大小。一般配置
? ? ? ? ? ? ? ? ? ? ? 新生代的大小為整個堆空間的1/3 到 1/4
-XX:SurvivorRatio = eden/from 用來設置新生代中eden空間和s0空間的比例
例?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 spaceat 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會自動根據系統選擇。
轉載于:https://my.oschina.net/u/2552286/blog/664317
總結
以上是生活随笔為你收集整理的jvm诊断与优化(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转)jQuery禁止右键菜单,全选
- 下一篇: Instruments模板介绍(更新中.