1. 程式人生 > >java虛擬機學習

java虛擬機學習

堆棧 jdk5 增加 tro mod perm 方法 回收 入棧

方法區、堆、棧、程序計數器、本地方法棧
方法區(永久去):類定義,常量,靜態變量,各個線程共享的內存區域,即時編譯的代碼
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虛擬機學習