JVM探究
請你談談你對jvm的理解?java8虛擬機和之前的變化更新?
什么事oom,什么是棧溢出StackOverFlowError?怎么分析?
jvm的常用調優參數有哪些?
內存快照如何抓取,怎么分析Dump文件?知道嗎?
談談jvm,類加載器你的認識?
1、jvm的位置
在操作系統之上,包含在jre里。
2、jvm的體系結構
棧、本地方法棧、程序計數器不會發生gc。
jvm調優主要在堆,方法區有一小部分。
3、類加載器
作用:加載.class文件。
新建的對象放入堆里面,引用(地址)放到棧,其中引用指向堆里面對應的對象。
1)虛擬機自帶的加載器
2)啟動類(根)加載器 Bootstrap ClassLoader
3)擴展類加載器 Extension ClassLoader
4)應用程序(系統類)加載器 Application ClassLoader
4、雙親委派機制
檢查順序從下至上,加載順序從上到下。
如果一個類加載器需要加載類,那么首先它會把這個類請求委派給父類加載器去完成,每一層都是如此。一直遞歸到頂層,當父加載器無法完成這個請求時,子類才會嘗試去加載。
5、沙箱安全機制
控制遠程代碼執行的權限。
jdk1.6之后的域。
6、native
包含native關鍵字的方法,說明java的作用范圍拿不到了,會去調用底層c語言的庫。
會進入本地方法棧。
調用本地方法接口JNI。
JNI作用:擴展java的使用,融合不同的編程語言為java所用。 最初:c、c++
它在內存區域中專門開辟了一塊標記區域:native method stack,登記native方法
在最終執行的時候,通過JNI加載本地方法庫中的方法
7、pc寄存器
線程私有,保證線程順序。
8、方法區
方法區是被所有線程共享的,所有的字段和方法字節碼,以及一些特殊方法,如構造函數,接口代碼也在此定義,簡單說,所有定義方法的信息都保存在該區域,此區域屬於共享空間
存儲內容:static、final、.class、常量池
9、棧
一旦線程結束,棧就over了。
存儲:8大基本類型 + 對象引用 + 實例的方法
10、三種jvm
HotSpot
JRockit BEA
J9 vm IBM
11、堆
Heap,一個JVM只有一個堆內存,堆內存的大小是可以調節的。
堆內存划分:
1)新生區 :Eden、S0、S1。對象在這里誕生、成長、甚至死亡
Eden:所有對象都是在eden區new出來的。
2)老年區
3)永久區:jdk1.8以后,叫元空間(方法區在這里,常量池在方法區里)。這個區域是常駐內存的,用來存放jdk自身攜帶的class對象。
12、新生區、老年區
13、永久區(元空間)
元空間使用的是直接內存,與新生代和老年代分開。
14、堆內存調優
OOM:1)嘗試擴大堆內存看結果
2)分析內存,看一下哪個地方出了問題(專業工具)
Xms1024m Xmx1024m -XX:+PrintGCDetails
在一個項目中,突然出現了OOM故障,那么該如何排除?研究為什么出錯
jprofiler作用:
1)分析dump內存文件,快速定位內存泄露
2)獲得堆中的數據
3)獲得大的對象
15、GC -> 常用算法
輕GC
重GC
引用計數法:記錄每個對象 的引用次數,長時間沒有被引用的對象就被清除掉。復制算法:
好處:沒有內存碎片
壞處:浪費內存空間,多了一半to空間永遠是空的。
復制算法最佳使用場景:對象存活度較低的時候 -> 新生區
標記清除算法:
優點:不需要額外的空間。
缺點:兩次掃描,嚴重浪費時間,會產生內存碎片。
標記壓縮:
標記 -> 清除 -> 壓縮
16、JMM
17、總結