java虛擬機學習
方法區、堆、棧、程序計數器、本地方法棧
方法區(永久去):類定義,常量,靜態變量,各個線程共享的內存區域,即時編譯的代碼
heap:類對象,list,數組 線程共享區
棧:程序執行時是線程,線程執行就是調用方法,有(局部變量),每個線程都有自己的(線程私有的);每個方法調用都產生一個棧幀,調用方法就是入棧出棧
如果方法一直嵌套調用就會一直壓棧,就可能會出現棧溢出,
程序計數器:程序執行到哪一行了。
本地方法棧:和本地平臺(操作系統)調用操作系統的方法
垃圾回收;
堆:根據對象存活的年齡,分為新生代young Generation,老年代Old,
young Generation分為Eden space 和 Survivor(from,to(不會用))區域
垃圾回收算法掃描Edenspace 如果有價值的留下來放在survivor(from) 區, 經過默認15次以後還留下來了則放入Oldgegnration
如何回收,
標記-清除 如果對象太大,可以直接放在老年代
標記-整理
復制-算法 (to是用來騰挪的)
啟動java 虛擬機時可以設置Eden 和suivivor的比例,
老年代和新生代一樣大
垃圾回收實現
垃圾回收器
serial收集器 stop the world 全量回收
serial old 收集器
parnew收集器
吞吐量優先的,Parallel Scavenger收集器
CMS收集器 服務器端用的比價多(默認)
G1 回收器
-XX +Use垃圾回收
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-Xmx3550m:最大堆內存為3550M。
-Xms3550m:初始堆內存為3550m。
此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。
-Xmn2g:設置年輕代大小為2G。
整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設置每個線程的堆棧大小。
JDK5.0以後每個線程堆棧大小為1M,在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在 3000~5000左右。
-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5
-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。
設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6
-XX:MaxPermSize=16m:設置持久代大小為16m。
-XX:MaxTenuringThreshold=15:設置垃圾最大年齡。
如果設置為0的話,則年輕代對象不經過Survivor區,直 接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象 再年輕代的存活時間,增加在年輕代即被回收的概論。
收集器設置
-XX:+UseSerialGC:設置串行收集器
-XX:+UseParallelGC:設置並行收集器
-XX:+UseParalledlOldGC:設置並行年老代收集器
-XX:+UseConcMarkSweepGC:設置並發收集器
垃圾回收統計信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
並行收集器設置
-XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。
-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間
-XX:GCTimeRatio=n:設置垃圾回收時間占程序運行時間的百分比。公式為1/(1+n)
並發收集器設置
-XX:+CMSIncrementalMode:設置為增量模式。適用於單CPU情況。
-XX:ParallelGCThreads=n:設置並發收集器年輕代收集方式為並行收集時,使用的CPU數。並行收集線程數。
java虛擬機學習