快速了解Java虛擬機(JVM),看這兒就夠了
一、JVM相關概念匯總
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。引入Java語言虛擬機后,Java語言在不同平臺上運行時不需要重新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。
1、JVM內存圖
2、JVM類加載器
在類加載階段,通過一個類的全限定名來獲取描述該類的二進制字節流的這個動作的“代碼”被稱為“類加載器”(Class Loader),這個動作是可以自定義實現的。
類加載器也是一段程序,一段代碼,代碼可能是c或c++、Java所編寫,主要是讀取磁盤下或jar包中的Class文件,裝載到jvm中
虛擬機自帶的類加載器
啟動類加載器(rt.jar) 根加載器 C++實現的
擴展類加載器 (擴展的類)extends ClassLoader
應用程序加載器(自己寫的類) extends ClassLoader
3、雙親委派模型
如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成。
每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到最頂層的啟動類加載器中。只有當上一層類加載器反饋自己無法完成這個加載請求(它的搜索范圍中沒有找到這個類)時,下一層類加載器才會嘗試自己去加載。
三個加載器都加載不到就會拋出 ClassNotFund異常
JDK設計雙親委派模型的好處:
確保安全,避免核心類庫被修改
避免重復加載
保證類的唯一性。
雙親委派模型可以被打破,需要自定義類加載器,繼承ClassLoader類,重寫LoadClass方法。
native:
使用native關鍵字時,會去調用底層的c語言的庫
進入本地方法棧,調用本地方法的本地接口 JIN
JIN作用:擴展java的使用,融合不同的語言為java所有
方法區主要存放:靜態變量,常量,類信息,常量池。
4、堆
一個JVM只有一個堆內存,堆內存大小可以調節。
類加載器讀取了類文件會把,類,方法,常量,變量,保存所有引用類型的真實對象。
堆內存主要分為三個區域:新生區(伊甸園)、老年區、永久區。
堆、元空間(方法區)是線程共享的;其他區域是線程私有的
特點及作用:
1、線程共享的一塊區域;
2、虛擬機啟動時創建;
3、虛擬機所管理的內存中最大的一塊區域;
4、存放所有實例對象或數組;
5、GC垃圾收集器的主要管理區域;
6、可分為新生代、老年代;
7、新生代更細化可分為Eden、
From Survivor、To Survivor,Eden:Survivor = 8:1:1
8、可通過-Xmx、-Xms調節堆大小;
9、無法再擴展
java.lang.OutOfMemoryError: Java heap space
GC垃圾回收機制:主要回收新生區和老年區
堆內存滿,拋出,OOM錯誤。 JDK8之前叫永久存儲區,JDK8之后叫元空間。 邏輯上存在,物理上不存在
新生區:
類誕生和成長,直到死亡的地方
所有的對象都在伊甸園區new出來
老年代:
·當新生代經歷15次輕GC后還存在引用的,則被轉移到老年代
永久區:
永久區常駐內存,用來存放JDK自身攜帶的Class對象,interface元數據,存儲的是Java運行的一些環境,這個區域不存在垃圾回收。關閉虛擬機時,釋放這個區域的內存。
OOM:
-Xms:設置初始化分配內存大小 1/64 -Xmx:設置最大分配內存1/4
-XX:+PrintGCDetails GC清理垃圾信息 -XX:+HeapDumpOnOutOfMemoryError dumpOOM錯誤文件
嘗試擴大內存空間看結果,如果還有錯誤,分析代碼是否出現垃圾代碼或者死循環。
內存快照分析工具,MAT,Jprofiler 作用:
①分析Dump內存文件,快速定位內存泄漏 ②獲得堆中數據 ③獲得最大對象
5、GC
作用區域:堆(堆+方法區(非堆)))
GC兩種類型:輕GC 針對新生代和偶爾的幸存區(from,to) 重GC(全局GC)
GC的算法:標記清除法 不需要額外內存空間,兩次掃描,浪費時間,產生內存碎片 、標記壓縮,復制算法(新生代、伊甸園區 )伊甸園區和to區為空,引用計數器
GC算法總結:
內存效率:復制算法>標記清除算法>標記壓縮算法(時間復雜度)
內存整齊度:復制算法=標記壓縮算法>標記清除
內存利用率:標記壓縮算法=標記清除>復制算法
新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么區別?
新生代回收器:Serial、ParNew、Parallel Scavenge
老年代回收器:Serial Old、Parallel Old、CMS
整堆回收器:G1
新生代垃圾回收器一般采用的是復制算法,復制算法的優點是效率高,缺點是內存利用率低;老年代回收器一般采用的是標記-整理的算法進行垃圾回收。
6、棧
特點及其作用:
1、線程私有;
2、方法執行會創建棧幀,存儲局部變量表等信息;
3、方法執行入虛擬機棧,方法執行完出虛擬機棧;(先進后出)
4、棧深度大于虛擬機所允許StackOverflowError;
5、棧需擴展而無法申請空間OutOfMemoryError(比較少見);hotspot虛擬機沒有;
6、棧里面運行方法,存放方法的局部變量名,變量名所指向的值(常量值、對象值等)都存放到堆上的;
7、棧一般都不設置大小,棧所占的空間其實很小,可以通過-Xss1M進行設置,如果不設置默認為1M;
8、隨線程而生,隨線程而滅;
9、該區域不會有GC回收。
Java JVM 虛擬化
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。