jvm初步入門
本博客中的所有內容都是來自b站狂神說視頻教程,如有侵權聯系我洗掉,
下面是視頻鏈接:b站狂神說
關于jvm的幾個小問題
1. jvm的位置:
jvm是一個運行在作業系統上的用c語言撰寫的虛擬機(就好像是一個軟體,)我們寫的java軟體在jvm上運行,
2. jvm的體系結構:

3. 類加載器:
作用:
加載class檔案~
加載順序
-
虛擬機自帶的加載器
-
啟動類(根)的加載器
-
擴展類加載器
-
應用程式加載器
4. 雙親委派機制:
雙親委派機制就是java中,當一個類要被加載的時候,會先從應用程式加載器加載,然后再去3,2,1中,去找有沒有我們需要的方法,如果2中沒有,就用3中的方法,如果3中沒有就用4中的方法,當后加載的拋例外,才會用先加載的,
這同時也說明了java= c++-- 封裝了c++中的指標,記憶體管理,垃圾回收,,,,
5. 沙箱安全機制:
1. 什么是沙箱?
沙箱就是限制程式運行的一個環境
在類加載之前,保證有一些代碼不會被加載,來保護java jvm不會被破壞
6. native
navtive表示呼叫java之外的東西為自己所用,其他的語言(最初是為了呼叫C,C++),native會呼叫JNI,通過JNI來呼叫系統中的東西,
7. 方法區有哪些東西?
方法區中只有:static,final,CLass,常量池~
堆疊:一種資料結構
程式=資料結構+演算法
堆疊:先進后出,后進先出,(就好像一個桶)
佇列:先進先出
java程式在開始運行的時候,先把main方法放到堆疊中,再由main方法去呼叫其他需要的方法,如果main方法被彈出堆疊,程式也就運行結束了,
堆疊溢位
方法之間回圈呼叫,不停的把方法放入堆疊中,導致,堆疊儲存滿,這樣就會堆疊溢位,
當一個方法運行結束后,就會被彈出堆疊,當main被彈出堆疊,程式運行結束,
當一個執行緒結束,堆疊記憶體就會被釋放,對于堆疊來說,不存在垃圾回收問題,
程式正在運行的方法,一定在堆疊的頂部
堆疊+堆+方法區的互動關系:

三種jvm
我們通常用的都是Java HotSpot(TM)這個虛擬機,他是由sun提供的虛擬機,
堆
一個jvm只有一個堆記憶體,堆記憶體的大小是可以調節的
類加載器讀取類檔案后,一般會把什么東西放到堆中?
類,方法,常量,變數~,保存我們所有參考型別的真實物件,
堆記憶體的三個區域
-
新生區 (young/new)
新生區分為伊甸園區、幸存0區、幸存1區,
只有在幸存0區或者幸存1區經過十幾次回圈的資料,才會進入養老區
上面這個回圈的程序叫做輕gc
-
養老區 (old)
上面的資料到養老區就會進行一次重gc(full GC)
經過上面的篩選之后的資料會進入養老區,當養老區快要滿時(整個堆都款要播爆了!),就會爆OOM
-
永久區 (perm)
方法區(非堆)就在元空間中存放
在jdk8之后,永久區改名叫做元空間

GC垃圾回收主要在伊甸園區和養老區,
假設記憶體滿了,OOM,堆記憶體不夠,
新生區
類誕生和成長的地方,甚至死亡(當第一次被垃圾回收之后就會死亡)
-
伊甸園區:
所有的物件都是在伊甸園區被new出來的
-
幸存區(0區,1區):
永久區(元空間)
這個區域用來存放jdk自身攜帶的一些class檔案,interface元資料主要用來存盤java運行時的環境,這個區域不存在垃圾回收!關閉jvm的時候才會釋放這個區域的記憶體,

如果一個程式報OOM錯誤要怎么處理?
-
嘗試擴大堆記憶體,看結果,
-
分析結果,看一下哪個地方出現了問題(專業工具)
上面說的專業工具就是jprofiler,利用這個在jvm中讓他生成dump檔案,然后利用jprofiler來查看dump檔案,具體的問題出現在哪里,
GC:垃圾回收
gc垃圾回收大部分回收的都是新生代,然后是幸存區,老年區
gc分兩種:輕gc和重gc
GC垃圾回收常用的演算法:
參考計數法(太low了,不高效)
給堆里的方法添加一個計數裝置,記錄每個方法的使用此時,清除掉沒有被使用的方法,py多用這種方法來回收垃圾,
- 好處:可以回收垃圾,
- 壞處:占用了新的記憶體空間,來計數,而且會產生垃圾碎片,
復制演算法
把新生代分成兩塊區域,使兩個區域不斷的復制,用這種方法來不斷的進行輕gc,
- 好處:不會產生垃圾碎片,
- 壞處:減少了一半的空間,
標記清除壓縮演算法:
先進行一次掃描,掃描到所有需要用到的方法,給他們標記,
然后再進行一次掃描,清除掉沒有用到的方法,
又進行一次掃描,把標記的方法全部移動到一塊區域,然后清除掉除這以外的區域,
- 好處:垃圾清理干凈,壓縮后不會有垃圾碎片,
- 壞處:需要進行多次掃描,耗費性能,
沒有最好的垃圾清理演算法,只有最合適的演算法,
JMM Java Memory Model(java記憶體模型):
快取的一致性協議,用于定義資料讀寫的規則,
JMM定義了執行緒的作業記憶體和主記憶體之間的抽象關系,
利用volatite關鍵字解決共享物件可見性,保證資料一致性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/166745.html
標籤:Java
上一篇:mybatis_4配置決議
