2019年JAVA最常見面試題匯總
JVM1.JVM如何加載一個類的過程,雙親委派模型中有哪些方法類加載過程:加載、驗證(驗證階段作用是保證Class文件的字節流包含的信息符合JVM規範,不會給JVM造成危害)、準備(準備階段為變量分配內存並設置類變量的初始化)、解析(解析過程是將常量池內的符號引用替換成直接引用)、初始化。雙親委派模型中方法:雙親委派是指如果一個類收到了類加載的請求,不會自己先嘗試加載,先找父類加載器去完成。當頂層啟動類加載器表示無法加載這個類的時候,子類才會嘗試自己去加載。當回到最開的發起者加載器還無法加載時,並不會向下找,而是拋出ClassNotFound異常。方法:啟動(Bootstrap)類加載器,標準擴展(Extension)類加載器,應用程序類加載器(Application ),上下文(Custom)類加載器。意義是防止內存中出現多份同樣的字節碼 。2.GC算法(什麽樣的對象算是可回收對象,可達性分析),CMS收集器jvm是如何判斷一個對象已經變成了可回收的“垃圾”,一般是兩個方法:引用記數法和根搜索算法。引用記數法沒辦法解決循環引用的問題,所以用根搜索。從一系列的”GC Roots“對象開始向下搜索,搜索走過的路徑稱為引用鏈。當一個對象到”GC Roots“之間沒有引用鏈時,被稱為引用不可達。引用不可到的對象被認為是可回收的對象。幾種垃圾收集器:1,Serial New/Serial Old(串行),2,Parrallel New (並行),3,Parrallel Scavenge,4,Parrallel Old,5,CMS(CMS收集器是一個以獲得最短回收停頓時間為目標的收集器,它是一種並發收集器,采用的是Mark-sweep算法。),6,G1(是一款並行與並發收集器,並且可建立可預測的停頓時間模型,整體上是基於標記清理,局部采用復制)3.JVM分為哪些區,每一個區幹嗎的?1)方法區(method):被所有的線程共享。方法區包含所有的類信息和靜態變量。2)堆(heap):被所有的線程共享,存放對象實例以及數組,Java堆是GC的主要區域。3)棧(stack):每個線程包含一個棧區,棧中保存一些局部變量等。4)程序計數器:是當前線程執行的字節碼的行指示器。4.JVM新生代,老年代,持久代,都存儲哪些東西?持久代主要存放的是Java類的類信息,與垃圾收集要收集的Java對象關系不大。所有新生成的對象首先都是放在年輕代的,年老代中存放的都是一些生命周期較長的對象。5.內存溢出和內存泄漏:內存溢出:程序申請內存時,沒有足夠的內存,out of memory;內存泄漏值垃圾對象無法回收,可以使用memory analyzer工具查看泄漏。6.進程與線程:進程值運行中的程序(獨立性,動態性,並發性),線程指進程中的順序執行流。區別是:1.進程間不共享內存 2.創建進程進行資源分配的代價要大得多,所以多線程在高並發環境中效率高。7.序列化與反序列化:序列化指將java對象轉化為字節序列,反序列化相反。主要是為了java線程間通訊,實現對象傳遞。只有實現了Serializable或Externalizable接口類對象才可被序列化。8.64 位 JVM 中,int 的長度是多數?Java 中,int 類型變量的長度是一個固定值,與平臺無關,都是 32 位。意思就是說,在 32 位 和 64 位 的Java 虛擬機中,int 類型的長度是相同的。9.Java 中 WeakReference 與 SoftReference的區別?Java中一共有四種類型的引用。StrongReference、 SoftReference、 WeakReference 以及 PhantomReference。StrongReference 是 Java 的默認引用實現, 它會盡可能長時間的存活於 JVM 內,當沒有任何對象指向它時將會被GC回收WeakReference,顧名思義, 是一個弱引用, 當所引用的對象在JVM 內不再有強引用時, 將被GC回收雖然 WeakReference 與 SoftReference 都有利於提高 GC 和 內存的效率,但是 WeakReference ,一旦失去最後一個強引用,就會被 GC 回收,而 SoftReference 會盡可能長的保留引用直到 JVM 內存不足時才會被回收(虛擬機保證), 這一特性使得SoftReference 非常適合緩存應用10.解釋 Java 堆空間及 GC?當通過 Java 命令啟動Java 進程的時候,會為它分配內存。內存的一部分用於創建堆空間,當程序中創建對象的時候,就從對空間中分配內存。GC 是 JVM 內部的一個進程,回收無效對象的內存用於將來的分配。11.Java 中堆和棧有什麽區別?JVM 中堆和棧屬於不同的內存區域,使用目的也不同。棧常用於保存方法幀和局部變量,而對象總是在堆上分配。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。
並發,鎖1.volatile關鍵字, Lock並發編程中:原子性問題,可見性問題,有序性問題。volatile關鍵字能保證可見性,字能禁止指令重排序,但是不能保證原子性。可見性只能保證每次讀取的是最新的值,但是volatile沒辦法保證對變量的操作的原子性。在生成的會變語句中加入Lock關鍵字和內存屏障。Lock 實現提供了比使用synchronized 方法和語句可獲得的更廣泛的鎖定操作,它能以更優雅的方式處理線程同步問題。用sychronized修飾的方法或者語句塊在代碼執行完之後鎖自動釋放,而用Lock需要我們手動釋放鎖2.MYSQL常用優化(sql優化,表結構優化等)SQL優化、表機構優化、索引優化、緩存參數優化3.java每改一點都需要重新編譯打包部署,有沒有更好的方法可以使用熱加載4.進程間通信有哪幾種方式?1)管道(Pipe),2)命名管道(named pipe),3)信號(Signal),4)消息(Message)隊列,5)共享內存,6)內存映射(mapped memory),7)信號量(semaphore),8)套接口(Socket)5.Sychronized修飾靜態方法,鎖定類本身而不是實例,非靜態方法鎖定實例。6. 操作系統什麽情況下會死鎖?所謂死鎖:是指多個進程在運行過程中因爭奪資源而造成的一種僵局。產生的原因:競爭資源:當系統中多個進程使用共享資源,並且資源不足以滿足需要,會引起進程對資源的競爭而產生死鎖。進程間推進的順序非法:請求和釋放資源的順序不當,也同樣會導致產生進程死鎖7.產生死鎖的四個條件:1.互斥條件(進程獨占資源)2.請求與保持(進程因請求資源而阻塞時,對已獲得的資源保持不放) 3.不剝奪條件(進程已獲得的資源,在末使用完之前,不能強行剝奪) 4.循環等待(若幹進程之間形成一種頭尾相接的循環等待資源關系)8. 如何理解分布式鎖?由於在平時的工作中,線上服務器是分布式多臺部署的,經常會面臨解決分布式場景下數據一致性的問題,那麽就要利用分布式鎖來解決這些問題。9. 線程同步與阻塞的關系?同步一定阻塞嗎?阻塞一定同步嗎?線程同步與否 跟 阻塞非阻塞沒關系,同步是個過程,阻塞是線程的一種狀態。多個線程操作共享變量時可能會出現競爭。這時需要同步來防止兩個以上的線程同時進入臨界區內,在這個過程中後進入臨界區的線程將阻塞,等待先進入的線程走出臨界區。10. 同步和異步有什麽區別?同步和異步最大的區別就在於。一個需要等待,一個不需要等待。同步可以避免出現死鎖,讀臟數據的發生,一般共享某一資源的時候用,如果每個人都有修改權限,同時修改一個文件,有可能使一個人讀取另一個人已經刪除的內容,就會出錯,同步就會按順序來修改。11. 線程池根據系統自身的環境情況,有效的限制執行線程的數量,使得運行效果達到最佳。線程主要是通過控制執行的線程的數量,超出數量的線程排隊等候,等待有任務執行完畢,再從隊列最前面取出任務執行12. 如何調用 wait()方法?使用 if 塊還是循環?為什麽?wait() 方法應該在循環調用,因為當線程獲取到 CPU 開始執行的時候,其他條件可能還沒有滿足,所以在處理前,循環檢測條件是否滿足會更好。wait(),notify()和notifyall()方法是java.lang.Object類為線程提供的用於實現線程間通信的同步控制方法。等待或者喚醒13. 實現線程的幾種方法(1)繼承Thread類,重寫run函數(2)實現Runnable接口,重寫run函數(3)實現Callable接口,重寫call函數14. 什麽是多線程環境下的偽共享(false sharing)?偽共享是多線程系統(每個處理器有自己的局部緩存)中一個眾所周知的性能問題。緩存系統中是以緩存行(cache line)為單位存儲的。緩存行是2的整數冪個連續字節,一般為32-256個字節。最常見的緩存行大小是64個字節。當多線程修改互相獨立的變量時,如果這些變量共享同一個緩存行,就會無意中影響彼此的性能,這就是偽共享。
網絡、數據庫1.TCP如何保證可靠傳輸?三次握手過程?在TCP的連接中,數據流必須以正確的順序送達對方。TCP的可靠性是通過順序編號和確認(ACK)來實現的。TCP 連接是通過三次握手進行初始化的。三次握手的目的是同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息。第一次是客戶端發起連接;第二次表示服務器收到了客戶端的請求;第三次表示客戶端收到了服務器的反饋。2. Linux下你常用的命令有哪些?1. cd命令用來改變所在目錄。cd / 轉到根目錄中cd ~ 轉到用戶目錄下2. ls命令用來查看目錄的內容。3. cp命令用來拷貝文件cp 4.mv命令 mv t.txt Document 把文件t.txt 移動到目錄Document中。3. 常用的hash算法有哪些?1.加法hash:所謂的加法Hash就是把輸入元素一個一個的加起來構成最後的結果。2.位運算hash:這類型Hash函數通過利用各種位運算(常見的是移位和異或)來充分的混合輸入元素3.乘法hash:33*hash + key.charAt(i)4. 什麽是一致性哈希?設計目標是為了解決因特網中的熱點(Hot spot)問題,一致性hash算法提出了在動態變化的Cache環境中,判定哈希算法好壞的四個定義:1、平衡性(Balance) 2、單調性(Monotonicity) 3、分散性(Spread) 4、負載(Load)5. 數據庫中的範式有哪些?第一範式----數據庫中的表(所有字段值)都是不可分割的原子數據項。第二範式----數據庫表中的每一列都和主鍵相關,而不能只和主鍵的某一部分相關。第三範式----數據庫表中每一列數據都和主鍵直接相關,不能間接相關。範式是為了減小數據冗余。6. 數據庫中的索引的結構?什麽情況下適合建索引?數據庫中索引的結構是一種排序的數據結構,數據庫索引是通過B樹和變形的B+樹實現的。什麽情況下不適合建立索引:1.對於在查詢過程中很少使用或參考的列;對於那些只有很少數據值的列;對於那些定義為image,text和bit數據類型的列;當修改性能遠大於檢索性能。根據系統自身的環境情況,有效的限制執行線程的數量,使得運行效果達到最佳。線程主要是通過控制執行的線程的數量,超出數量的線程排隊等候,等待有任務執行完畢,再從隊列最前面取出任務執行7. concurrent包下面,都用過什麽?java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock8. 常用的數據庫有哪些?redis用過嗎?…9. 你知道的開源協議有哪些?GPL (GNU General Public License) :GNU通用公共許可協議LGPL (GNU Lesser General Public License) :GNU寬通用公共許可協議BSD(Berkeley Software Distribution) :伯克利軟件分發許可協議MIT (Massachusetts Institute of Technology):MIT之名源自麻省理工學院Apache (Apache License) :Apache許可協議MPL (Mozilla Public License) :Mozilla公共許可協議10.表單提交中,get和post區別1.get從服務器獲取信息,post向服務器傳信息2.get傳送數據量比較小,post可以比較大3.get安全性比較低11. TCP 協議與 UDP 協議有什麽區別?(answer答案)TCP(Tranfer Control Protocol)的縮寫,是一種面向連接的保證傳輸的協議,在傳輸數據流前,雙方會先建立一條虛擬的通信道。可以很少差錯傳輸數據。UDP(User DataGram Protocol)的縮寫,是一種無連接的協議,使用UDP傳輸數據時,每個數據段都是一個獨立的信息,包括完整的源地址和目的地,在網絡上以任何可能的 路徑傳到目的地,因此,能否到達目的地,以及到達目的地的時間和內容的完整性都不能保證。所以TCP必UDP多了建立連接的時間。相對UDP而言,TCP具有更高的安全性和可靠性。TCP協議傳輸的大小不限制,一旦連接被建立,雙方可以按照一定的格式傳輸大量的數據,而UDP是一個不可靠的協議,大小有限制,每次不能超過64K。
2019年JAVA最常見面試題匯總