JVM概念以及常用設置
DAY 1
Jvm- java虛擬機
- 類加載子系統
- 加載class文件到方法區
- 方法區
- 存放類信息
- 常量信息
- 常量池信息
- 輔助堆棧的永久區,解決堆棧信息的產生,是先決條件
3. Java堆(重要)
- 虛擬機啟動的時候建立
- 最主要的內存工作區域
- 幾乎所有的對象實例都存放到Java堆中,堆內存是所有的線程共享的
- 解決數據存儲的問題
4. 直接內存
- Java的NIO庫允許java程序使用直接內存,從而提高性能,速度優於JAVA堆
- 讀寫頻繁可考慮使用
5. Java棧
- 線程創建的時候被創建
- 保存局部變量、方法參數、引用、java方法的調用、返回值等
- 解決數據運行問題
6. 本地方法棧(不重要)
7. 垃圾回收系統(重要)
- GC垃圾回收系統
8. PC寄存器(不重要)
- 保存一些指針
9. 執行引擎
- 負責執行虛擬機的字節碼
堆棧方法區詳細
Java堆(核心)
Java堆完全自動化管理,通過垃圾回收機制自動清理,不需要顯示的釋放。
Java堆如何劃分?(面試)
通常分為新生代和老生代,其中新生代存放新生的對象,老的存放老的對象。
新生代:eden區(對象剛實例化的狀態)、S0(from)區、S1(TO)區(s0\s1大小相等、可相互轉換的角色)
對象通常先分配到eden區,在一次GC後,如果對象還在,那麽進去s0或者s1區,後面沒經歷一次GC年齡加1,到達一定的年齡後,進入老年代。
新生代中GC的頻率會比老年代高很多。
Java棧(不是特別重要)
線程私有的內存空間。
局部變量表:報錯信息
操作數棧:計算過程中的臨時變量
幀數據區:報錯信息
方法區:
如果系統定義太多的類,可能會導致方法區溢出。
虛擬機參數:
堆分配參數(一)(+啟用,-禁用)
(1) -XX 對於系統級別的(JVM)配置,配置日誌信息或者說配置JVM使用什麽樣的垃圾回收器。
(2)非-XX的基本上都是對應用層面上的配置。
+啟用 -禁用
-XX:+PrintGC使用這個參數,虛擬機啟動後,只要遇到GC就會打印日誌。
-XX: +UseSerialGC配置串行回收器
-XX:+PrintGCDetails可以查看詳細信息,包括各個區的情況
-Xms:設置java程序啟動時初始化堆大小
-Xmx: 設置java程序能獲得的最大堆大小。
-XX:+PrintCommandLineFlags:可以將隱式或者顯示傳給虛擬機的參數輸出
初始值與最大值配置的一樣可減少GC的回收次數。
新生代配置:
Xmn:設置新生代的大小,這個參數對GC行為有很大的影響,占整個堆空間的1/3到1/4左右。
-XX:用來設置新生代中eden空間和from/to空間的比例,含義-XX:SurvivorRatioe=eden/from=eden/to
實例2:
不同的堆分布情況,對系統執行會產生一定的影響,在實際工作中,應該根據系統的特點做出合理的配置,基本策略:盡可能將對象預留在新生代,減少老年代的GC次數。除了可以設置新生代的絕對大小(-Xmn),還可以使用(-XX:NewRatio)設置新生代和老年代的比例:-XX:NewRatio=老年代/新生代
堆溢出處理:
如下的配置可將溢出的信息打印到路徑下,可copy文件到eclipse下的memory analyer插件查看
-Xss指定線程的最大棧空間,參數決定了函數可調用的最大深度
方法區:
和java堆一樣,是所有線程共享的內存區域,它用於保存系統的類信息,可以保存多少信息可以對其進行配置,在默認情況下,-XX:MaxPremSize為64MB,如果系統運行時生產大量的類就需要設置一個相對合適的方法區,以避免永久區內存溢出。
直接內存配置:
廣泛用在NIO中,直接跳過java堆。
垃圾回收概念和其算法:
垃圾回收有很多算法:如引用計數法、標記壓縮法、
引用計數:被引用+1 失去引用 -1 遇到循環或者遞歸浪費性能。
標記清除法:被標記的時候由於JVM不會清除完全,會有碎片的問題。比如1M需要標誌清除,但是可能JVM只能清除0.999M。
復制算法(新生代) from區to區相互轉換角色。
標記壓縮法(老年代):在標記清除的基礎下進行壓縮,壓縮到內存的一端進行清除防止碎片的問題。
分代算法:根據對象的特點把內存分為N塊,而後根據每個內存的特點使用不同的算法。
分區算法:oracle新的概念,主要講整個內存分為N多個小的獨立空間,每個小空間都可以獨立使用。減少GC停頓。
GC停頓:GC回收的時候會讓所有應用的線程進入停頓狀態,回收完成後再繼續。
對象如何進入老年代:
-XX:MaxThnuringThreshold, 默認15次。
-XX:PretenureSizeThreshold指定進入老年代的對象大小。要註意TLAB區域優先分配空間。
TLAB:每一個線程都會產生一個TLAB區,為了加速對象分配而生的。每一個TLAB區來避免多線程沖突的問題,提高對象分配的效率。一般不會太大。
-XX:+UseTLAB使用TLAB區。默認使用。
JVM概念以及常用設置