1. 程式人生 > >JVM(Java虛擬機器),多執行緒,集合,設計模式的一些面試題

JVM(Java虛擬機器),多執行緒,集合,設計模式的一些面試題

JVM(java Virtual Machine) Java虛擬機器,是一個虛擬的計算機,通過在真實的計算機上模擬模擬計算機功能來實現的,
Java語言最重要的特點就是挎平臺。使用JVM就是為了支援與作業系統無關,實現挎平臺。
Java編譯器只要面向JVM,生成JVM能理解的程式碼或位元組碼檔案,Java原始檔經編譯成位元組碼程式,通過JVM將每一條指令翻譯成不同平臺機器碼,通過特定平臺執行。

JVM的儲存空間中:
1,PC :用來儲存JVM執行的下條指令,如果時本地程式,不用儲存
2,JVM棧 :是執行緒私有的,用來存放執行緒中的區域性基本型別變數(八大基本型別),以及部分的返回結果。
3,堆(Heap):用來儲存物件例項以及陣列值得區域,可以認為Java中所有通過new建立的物件都在此分配,Heap中的物件記憶體需要等等GC進行回收。
但是,堆是所有執行緒共有的。
4,方法區域:存放所載入的類的資訊(名稱,修飾符),類中的靜態變數,類中定義為final型別的常量,類中的Field資訊,類中的方法資訊,反射機制中獲取的那個都在該區域中儲存。
5,執行時常量池:存放的為類中的固定的常量資訊,方法和Field的引用資訊等,其空間從方法區域中分配。
6,本地方法堆疊:JVM採用本地方法堆疊來支援native方法的執行,此區域勇於儲存每個native方法呼叫的狀態。

JVM中的立即回收機制判定“已死”的演算法:
1,引用計數演算法:引用成功+1,引用失敗—1,減到0時,說明可以回收。
2,可達性分析演算法:
Java中使用可達性分析演算法來判定物件是否存活的

設計模式
設計模式分為三大類:建立型、結構型和行為型;

建立性設計模式:
1,Singleton,單例設計模式:保證一個類只有一個例項,並提供一個訪問它的全域性訪問點
2,Abstract Factory 抽象工廠:提供一個建立一系列或相互依賴物件的介面,而無需制定她們的具體類
3,Factory Method 工廠方法
4,Builder 建造模式
5,Prototype 原型模式

行為型有:
1,Iterator 迭代器模式
2,Observer ,觀察者模式
3,Strategy,策略模式

結構型模式:
1,Proxy 代理模式
2,Adapter 介面卡模式
3,Decrade ,裝飾者模式

JAVA高併發
首先弄懂執行緒和程序的概念
1,程序是一個實體,每一個程序都有自己地址空間,一般情況下,包括文字區域,資料區域和堆疊,其中文字區域存放處理器執行的程式碼。資料區域儲存變數和程序執行期間使用的動態分配的記憶體;堆疊區域存放著活動過程中呼叫的指令和本地變數
2,一個標準的執行緒有執行緒ID,當前的指令指標PC,暫存器集合和堆疊組成,執行緒是程序中的一個實體,是被系統獨立排程和分配的基本單位,執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源,但它可與同屬一個程序的其它執行緒共享程序所擁有的額全資源。
3,區別不同:
a、地址空間:程序內的一個執行單元;程序至少有一個執行緒,她們共享程序的地址空間,;而程序有自己獨立的地址空間
b、資源擁有:程序是資源分配和擁有的單位,同一個程序內的執行緒共享程序的資源。
c、執行緒是處理器排程的基本單位,但程序不是
d、二者均可併發

Java Thread狀態
1,NEW 執行緒建立尚未啟動。
2,RUNNABLE 執行緒在執行的狀態。
3,BLOCKED 表示正在等待進行臨界區。
4,WAITING表示進入臨界區後,等待執行。
5,TIMED_WRITING 表示有限的時間等待。
6,TERMINATED 表示執行完畢,等待回收。

執行緒同步以及執行緒排程相關的方法
1,wait():使執行緒處於等待狀態,並且釋放所持有的物件鎖
2,sleep():是一個在執行狀態的執行緒處於睡眠狀態,是一個靜態方法,呼叫此方法要處理InterruptedException異常;
3,notify(),喚醒一個執行緒,喚醒的與優先順序無關
4,notifyAll()喚醒所有處於等待狀態的執行緒,喚醒的執行緒與優先順序有關。

程序排程的演算法
實時系統:FIFO(first Input First Output)先進先出演算法 SJF(Shortest Job First 最短作業優先演算法),SRTF(Shortest Remaining time First 最短剩餘時間優先演算法)
互動式系統:RR(Round Robin 時間片輪轉演算法),HPF(Hightest Priority First 最高優先順序演算法),多級佇列,最短程序優先,保證排程,彩票排程,公平共享排程。

wait()和sleep()的區別
1,sleep來自Thread類,和wait來自Object類
2,呼叫sleep()方法的過程中,執行緒不會釋放物件鎖,而呼叫wait方法執行緒會釋放物件鎖
3,sleep睡眠後不出讓系統資源,wait讓出系統資源其它執行緒可以佔用CPU
4,sleep需要指定一個睡眠時間,時間一到會自然喚醒。

執行緒池
執行緒池的作用:在程式啟動的時候就建立若干執行緒來相應處理,它們被稱為執行緒池,裡面的執行緒叫工作執行緒
1,降低資源消耗,通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。
2,提高相應速度,當任務到達時,任務可以不需要等到執行緒建立就能立即執行
3,提高執行緒的可管理性,

死鎖以及解決方法
死鎖產生的四個必要條件
1,互斥條件
2,不可剝奪條件
3,請求和保持條件
4,迴圈等待條件

解決死鎖:
其實沒有一個真正的解決辦法
1,死鎖預防,就是不讓上面的四個條件同時成立
2,合理分配資源
3,使用銀行家演算法,如果該程序請求的資源作業系統剩餘量可以滿足,那麼就分配。

執行緒狀態之間的轉換:

初始狀態 -->可執行狀態<—>執行狀態—>死亡狀態
↑ ↓
阻塞狀態

集合
HashSet TreeSet,LinkedHashSet區別?
1,需要速度快的集合,使用HashSet
2,需要集合有排序功能的,使用TreeSet
3, 需要按照插入的順序儲存集合,使用LinkedHashSet

HashMap和HashSet的區別
1,hashmap實現了map介面,HashSet實現了set介面
2,HashMap儲存鍵值對,HashSet儲存物件
3,HashMap呼叫put()向map中新增元素,HashSet呼叫add()向set中新增元素
4,HashMap使用Key計算hashcode,HashMap使用成員計算Hashcode
HashMap相對於HashSet較快,因為它是使用唯一的鍵獲取物件HashSet較HashMap來說比較慢

8.HashMap的實現原理

通過put和get儲存和獲取物件,儲存物件時,我們將K/V傳給put方法時,它呼叫hashcode計算hash從而得到bucket位置,進一步儲存,HashMap會根據當前bucket的佔用情況自動調整容量。獲取物件時,我們將K傳遞給get,他呼叫hashcode計算hash從而得到bucket位置,並進一步呼叫equals()方法確認鍵值對