1. 程式人生 > >JAVA知識點在整理(可供面試參考)

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的反射機制允許我們不重新編譯程式碼,因為它的物件都是動態生成的。