JVM入門_筆記_狂神說


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、總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM