JAVA知識點在整理(可供面試參考)
1.JVM的結構,JVM原理
1.1 虛擬機器的結構:
- 類載入子系統
- 執行時資料區(記憶體空間)
- 執行引擎
- 本地方法介面a
其中記憶體空間又分為:
- 堆
- 方法區
- JVM棧
- 本地方法棧
- 程式計數器
1.2 虛擬機器原理:
一次編譯,到處執行.是通過java程式碼編譯之後生成.class檔案.之後在虛擬機器上進行解釋,變成當前虛擬機器所在系統環境能夠識別的機器碼然後再去執行,不同的機器上只需要安裝不同的虛擬機器即可實現對.class檔案的先解釋再執行.
2.ClassLoader載入機制,載入原理
2.1 先把.class檔案載入到記憶體,然後校驗,解析,初始化.最後才能變成虛擬機器可以使用的Java型別.
2.2 java中一共有三種載入器
- Bootstrap Classloader 載入存放在lib目錄下的類,或者設定虛擬機器引數指定路徑的類,是c++寫的,我們看不到具體的內容.
- Extension CLassLoader 在ext目錄下的類,或者系統變數設定的類.
- App ClassLoader 載入我們自己寫的類.一般情況下,程式中預設的載入器就是這個
3.雙親委託載入模型的好處
除了頂層的Bootstrap載入器外,其他的類載入器都應該有自己的父類載入器.實現使用的組合關係.
當一個類載入器收到了載入類的請求之後,會向他的父類載入器載入,每個類載入都是這樣.然後最終傳到Bootstrap載入器中.只有這個過程沒有返回所需的類時,子類載入器才會嘗試自己去載入.這種載入方式的好處是在任何載入環境都是同一個類,因為不同的類載入器載入同一個class,結果是兩個獨立的類,如果不用這種方式的話,我們的類就哪裡都是,並且會很亂.
這個問題首先是因為虛擬機器中不同的類載入器對同一個class檔案去載入類,得到的類是相互獨立的.在型別判斷返回結果為false;
然後雙親委託載入是除了Bootstrap之外,不管哪一個類載入器,都應該有父類載入器.這樣的話,可以保證我們的加載出來的類是在一個環境中加載出來的.不然的你載入一個我載入一個.就亂套了.
4.LinkedHashMap和TreeMap原始碼,這兩個的實現分別是什麼?有什麼區別?
LinkedHashMap = 陣列+雙向連結串列…賦予了map有序的能力.
TreeMap 基於紅黑樹實現了SortMap
5.ThreadPool實現?
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue
核心執行緒數,最大執行緒數,阻塞佇列.
6.幾種鎖的實現,如何避免死鎖?
可重入鎖,可中斷鎖,讀寫鎖,公平鎖,非公平鎖
可重入鎖: synchronize 和 lock 都是可重入鎖
可終端所: lock是,synchronize不是
公平鎖: lock可以設定
非公平鎖: synchronize
悲觀鎖和樂觀鎖.
HashTable ConcurrentHashMap
synchronize lock
如何避免死鎖.
加鎖順序
加鎖超時,當嘗試獲取鎖的時候,通過設定超時時間,放棄獲取目標鎖的請求,並釋放自己佔有的鎖.
避免同一個執行緒獲取多個鎖
7.多執行緒輔助類
lock,CountDownLatch,Exchanger
8.ArrayCopy什麼時候使用?
ArrayList擴容,輸出,克隆.會呼叫Array.Copy()方法
9.MySQL的事務隔離級別
讀未提交,讀已提交,重複讀,序列化
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重複讀(read-committed) | 否 | 是 | 是 |
(預設)可重複讀(repeatable-read) | 否 | 否 | 是 |
序列化(serializable) | 否 | 否 | 否 |
10.分散式應用場景
分散式首要解決的問題是高可用(近乎100%可用,99.99%)!
高併發(百萬併發),高效能(毫秒級響應)
併發量大,容錯率低.
11.分散式事務
事務4個特性,CRID 原子性,一致性,隔離性,永續性.
基於分散式初衷,在資料的可用性和一致性有所取捨.
分段提交(CAP定理):
- 事務協調器需要所有涉及事務的資料庫進行預提交,並反饋是否可以提交
- 事務協調區需要所有涉及事務的資料庫進行提交.
優缺點:
優點:儘可能保持了資料的一致性,應用於對資料一致性要求較高的系統.
缺點:犧牲了分散式高可用特性.增加了系統複雜度,不適合高併發場景.
BASE理論:
可用和一致有所取捨,根據自身業務特點,使用合理方式,使事務達到一致性.
訊息事務,支付回撥視作事務.
12.分段提交的實現
就位確認.魔獸,劍網3. 一階段,二階段.
13.redis常用資料結構
String,List,set,hash,zset(sort set 有序集合)
14.如何實現分散式快取
需要解決的問題:
-
實現高可用為前提,還要具有一定的擴充套件性(根據不同時期,繼續增大快取的可用性,雙11,鹿晗介紹他的女朋友)
-
資料分片,均勻分佈在多個例項中.(解決分佈快取的最優情況)
-
讀寫分離,儘量減小快取穿透增加DB壓力.(增加容錯率,避免雪崩)
-
資料的一致性.
redis叢集.
通過key做一致性雜湊,實現key對應redis結點的分佈。
一致性雜湊的實現:
l hash值計算:通過支援MD5與MurmurHash兩種計算方式,預設是採用MurmurHash,高效的hash計算。
l 一致性的實現:通過java的TreeMap來模擬環狀結構,實現均勻分佈
15.分散式叢集的好處
高可用.
16.heap 和 stack 的區別
首先,在資料結構上來講,兩者屬於完全不同的兩種資料結構.
堆是一個完全二叉樹,並且堆中的每個節點,要麼總是不大於父節點,要麼總是不小於父節點
棧又叫堆疊,是一種只允許從一端對資料進行操作的線性表.
在虛擬機器記憶體上來講堆是儲存物件例項的地方,棧是我們執行物件行為的地方.
17.什麼是Spring IOC
Spring Ioc 是指Spring對應用中的類例項化進行管理,使我們的程式
程式碼間進行解耦,同時讓我們更多的去關注我們的程式碼邏輯,不需要我們
自己去管理物件的建立,需要使用的時候通過依賴注入到我們所需要使用
的類中即可.
那為什麼不直接用工廠模式呢,工廠模式也可以管理例項的初始化
因為IOC是通過反射機制來實現的。當我們的需求出現變動時,工廠模式會需要進行相應的變化。但是IOC的反射機制允許我們不重新編譯程式碼,因為它的物件都是動態生成的。