1. 程式人生 > 其它 >Ubuntu~~~MySQL的安裝與使用

Ubuntu~~~MySQL的安裝與使用

JVM由兩個子系統和兩個元件組成

兩個子系統分別是類載入器和執行引擎,兩個元件分別是執行時資料區和本地介面。

類載入器:將類載入到方法區。

五個步驟:

  1、載入:將class載入記憶體,並在堆中生成java.lang.class物件,作為方法區資料入口
2、驗證:驗證class是否符合JVM規範
3、準備:給靜態變數分配記憶體空間和初始化,此時的初始化只是給一個預設值還不是準確的值。
4、解析:將符號引用解析成直接引語,直接指向記憶體地址
5、初始化:給靜態變數和靜態程式碼塊賦初始值

載入機制:雙親委派模型

啟動類載入器→擴充套件類載入器→系統類載入器→自定義類載入器。當載入器接收到載入請求時,會先將載入任務委派給父載入器,同時父載入器也會總 同樣的操作。當發現父載入器已經載入了對應的類時,直接使用父載入器載入的類,若父載入器無法載入到對應的類,則再將載入任務返回給子載入器 進行載入。目的是,防止有人想替換系統級別的類,比如String.class等,防止危險程式碼的植入。

擴充套件知識(處理相同限定名的類):系統會優先載入jdk下的jar包檔案,而第二優先順序會載入專案中編譯成的class檔案,而第三優先順序則是載入我自定義 的jar包。或者可以把優先順序高的放在lib或者ext目錄下交由父載入器載入。

執行引擎:直譯器+即時編譯器+垃圾回收

直譯器:翻譯成本地機器指令

即時編譯器:編譯成機器碼

執行時資料區:

程式計數器:記錄程式執行位元組碼的行號。

虛擬機器棧:執行方法時,建立一個棧幀,儲存方法的區域性變數、動態連結、運算元棧以及方法出口

本地方法棧:功能和虛擬機器棧一樣,服務於本地方法。

方法區:也叫永久代,儲存常量、靜態變數和載入的class檔案,JDK1.8之後叫元資料區,使用本地記憶體。

堆:儲存了幾乎所有的物件和陣列。

堆疊區別:

1、堆的實體記憶體分配不聯絡,因此效率比較低;棧的實體記憶體分配連續,效率較高。

2、堆儲存物件例項和陣列;棧儲存區域性變數、運算元棧、動態連結和方法出口等。

3、堆執行緒共享;棧執行緒私有,生命週期和執行緒一致。

4、堆的記憶體執行時分配,大小不固定,一般遠大於棧;棧編譯時分配,大小固定。

本地方法區:儲存本地方法,即native修飾的方法,不可見。

垃圾回收

垃圾判斷方式:引用計數法(無法解決迴圈引用問題)、可達性分析法。

可達性分析法:JVM設定了一些GC Roots,由GC Roots向下搜尋,搜尋的路徑叫引用鏈,當一個物件沒有任何引用鏈連結時,即判斷為垃圾。

GC Roots:區域性變數的引用、常量的引用、靜態變數的引用、本地方法中的引用。這些都是活物件,GC Roots本質是通過找出所有活物件來把其餘空間認定為“無用”。

垃圾收集演算法:

標記清除:實現簡單,不需要移動物件;效率慢,會產生記憶體碎片。

標記整理:解決了標記清除的記憶體碎片問題,效率更慢。

複製演算法:將記憶體分為兩半,一半放置物件一半空閒,垃圾收集的時候,對放置物件的存活物件複製到空閒那一半,然後清空原來放置物件的那一半。效率 高,不會產生記憶體碎片,但是記憶體空間使用率低。

分代收集:根據物件的生命週期,將JVM分為新生代和老年代不同的代使用不同的演算法,新生代為複製演算法,老年代為標記清除或者標記整理。

minor GC:發生在新生代的GC,新生代分為一個Edon區和兩個survivor區。使用的是複製演算法,大概流程分為,Edon區記憶體不足時觸發minorGC時,會對 Edon區和放置存活物件的survivor區進行垃圾回收,垃圾回收之後存回的物件,會放置到剛才空閒的survivor區,同時會給存活物件設定年齡+1, 不同的垃圾收集 器會有不同的閾值,當年齡達到閾值時,物件會進入老年代。

major GC:發生在老年代的GC,觸發條件包括:1、minor GC存活的物件大於老年代剩餘空間;2、每次晉升老年代的平均大小大於老年大剩餘空間;3、永久 代滿了或者超過臨界值;4、放置很大的物件時。

Full GC:minor GC+minor GC

空間擔保機制:原因是因為新生代採用複製演算法,加入大量物件在minor GC之後依然存活,而sirvivor的空間是比較小的,這時候就需要老年到進行空間擔保。

擔保過程:在傳送minor GC之前,JVM會先檢查老年代的最大空閒空間是否大於新生代所有物件所佔空間總和,如果大於,則此次minor GC安 全,如果小於,則檢視是否允許擔保失敗的設定值是否為true,如果為true,則檢查下老年代空間是否大於歷次進入老年代的平均 大小如果大於,則進行有風險的minor GC,如果小於或者是否允許擔保失敗的設定值為false,則進行Full GC。

垃圾收集器:serial、serial old 、parNew、CMS、G1

CMS收集器

1、初始標記:標記GCroots 能關聯的物件,速度快,需要暫停所有工作執行緒。 2、併發標記:GC ROOTs 跟蹤過程,不需要暫停其他執行緒 3、重新標記:標記那些那些併發標記過程中,狀態發生變化的物件,需要暫停所有工作執行緒 4、併發清除:清理GC ROOTS不可達的物件,不需要暫停工作執行緒

G1收集器 1、標記整理演算法,不會有記憶體碎片 2、準確控制停頓時間,在不犧牲吞吐量的情況下,實現低停頓垃圾回收(將堆分為幾個大小固定的區域,跟蹤這些區域垃圾收集進度,維護一個優先順序列 表。區域和優先順序的劃分,確保了G在有限的時間內高效地回收垃圾)

GVM調優

設定新生代大小,新生代老年代比例,edon區和survivor區的比例等;

秒殺系統,大量物件同時產生,這些物件的生命週期很短,可以適當擴大新生代的Edon區 Edon也不是越大越好,太大的話垃圾收集的時間會變長

EDON區和survivor區的比例也不能設定太大 不然會導致survivor放不下,進而進入老年代

常見問題解決定位方式

1、top命令、vmstat命令檢視CPU、記憶體使用情況→jps命令檢視java程序號→ps -m檢視執行緒號→jstack命令檢視堆疊資訊,檢視具體程式碼是不是死鎖等;

2、通過一些工具比如阿里巴巴的阿爾薩斯arthas定位具體問題。

3、列印GC日誌,檢視下是否頻繁觸發full GC。

引用型別:

強引用-不會被垃圾回收器回收的引用

軟引用-記憶體溢位之前被回收的引用

弱引用-下次垃圾回收的時候需要被回收的引用

虛引用-垃圾回收返回通知

記憶體洩漏: 當長生命週期的物件引用短生命週期的引用,有可能發生記憶體洩漏。比如講一個物件置入快取當中,這個物件雖然沒有再被呼叫,但是由於快取一直在被使用, 因此該物件的記憶體得不到釋放。