Java面試-基礎第一部分

Java面試-基礎第一部分

 

JAVA基礎第一部分

  1. JVM結構原理、GC工作機制詳解

 

JVM分爲四個部分:

類加載器(ClassLoader):在JVM啓動或者類運行時將需要的class加載到JVM中;

執行引擎:負責執行class文件中包含的字節碼指令

本地方法接口:主要是調用C或C++實現的本地方法及返回結果;

內存區:JVM運行時操作分配的內存區。分爲5個區域:

方法區(Method Area):JDK1.8之後稱爲--元空間,存儲類結構信息,包括常量池、靜態變量、構造函數等,是線程共享的區域,爲與Java堆分區,方法區還有一個別名Non-Heap(非堆);

Java堆(Heap):存儲Java實例或對象的地方,是GC主要區域,是線程共享的區域;

Java棧(Stack):每創建一個線程,JVM就會創建對應的Java棧。Java棧中包含多個棧幀,每運行一個方法就創建一個棧幀,用於存儲局部變量表、操作棧、方法返回值,一個方法的調用與完成即一個棧幀的入棧與出棧過程。線程私有區域;

程序計數器(PC Register):保存當前線程執行的內存地址。JVM多線程機制,保證切換回到原先狀態。線程私有區域;

本地方法棧(Native Method Stack):類似於Java棧,主要爲JVM使用的native方法服務。線程私有區域。

Java與C/C++內存分配區別:C/C++每次申請內存需要malloc進行系統調用,需要內存切換,增加開銷;Java虛擬機一次分配大區域,new在該區域分配和釋放,減少系統調用次數。線程私有區域(Java棧、程序計數器、本地方法區)的內存隨線程生滅自動回收,因此Java垃圾回收(GC)主要針對於線程共享區域(Java堆與方法區)。

GC工作機制中對象判活方式:

引用計數:給一個對象添加引用計數器,每當有個地方引用它,計數器++,引用失效就--,爲零則爲垃圾;

可達性分析:以根集對象爲起始點進行搜索,如果有對象不可達的話,即是垃圾對象。

三種垃圾回收:Minor GC(年輕代)、Major GC(永久代)/Full GC(年輕代和永久代)

垃圾回收算法:

標記-清除算法:分爲“標記”與“清除”兩個階段,容易產生大量內存碎片。

複製算法:將內存按容量平分兩個區域,每次使用其中一塊,內存使用縮小爲原來的一半。

標記-整理算法:標記垃圾對象,然後清除對象,將存活空間移動爲連續區域。

分代收集:把Java堆分爲新生代和年老代,按特性選擇回收算法

年輕代(生存週期短,大量對象是垃圾對象)  複製

年老代(生存週期長,少量對象是垃圾對象)  標記整理  標記清除

     2.Java對象的生命週期

共分爲七個階段:創建階段(Creation)、應用階段(Using)、不可視階段(Invsible)、不可到達階段(Unreachable)、收集階段(Collected)、終結階段(Finalized)與釋放階段(Free)。

與“不可達階段”相比,“不可見階段”是指程序不再持有該對象的任何強引用,這種情況下,該對象仍可能被JVM等系統下的某些已裝載的靜態變量或線程等強引用持有着。

    3.Map或者HashMap的存儲原理

Map/HashMap底層以數組將Key-Value對作爲元素進行存儲,其中將key值進行Hash之後進行存儲,每個Hash值對應一個數組下標,當出現Hash值相同,再採用鏈表進行存儲。HashMap在JDK1.8及以後的版本中引入了紅黑樹結構,若桶中鏈表元素個數大於等於8時,鏈表轉換成樹結構;若桶中鏈表元素個數小於等於6時,樹結構還原成鏈表。

     4.當數據表中A、B字段做了組合索引,那麼單獨使用A或單獨使用B會有索引效果嗎

看A、B兩字段做組合索引的時候,誰在前面,誰在後面,如果A在前,那麼單獨使用A會有索引效果,單獨使用B則沒有,反之亦然。同理,使用like模糊查詢時,如果只是使用前面%(以某字段開頭),那麼有索引效果,如果使用雙%號匹配(包含某字段),那麼則無索引效果。

     5.數據庫存儲日期格式時,如何考慮時區轉換問題?

使用TimeStamp(時間戳),getTime()方法獲取時間無時區概念,Date()方式獲取存在時區概念,由本機系統時區決定。

     6.Java Object類中有哪些方法?

getClass():返回此Object的運行時類。

hashcode():返回該對象的哈希值。

equals():指示某個其他對象是否與此對象“相等”。

toString():返回該對象的字符串表示。

clone():創建並返回此對象的一個副本。

wait():在其他線程調用此對象的notify()方法或notifyAll()方法前,導致當前線程等待。

notify():喚醒在此對象監視器上等待的單個線程。

notifyAll():喚醒在此對象監視器上等待的所有線程。

finalize():當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。

     7.&和&&的區別

&爲位與運算,&&爲邏輯與操作

     8.HashMap衝突很厲害,最差性能,你會怎麼解決?

HashMap衝突即Hash函數計算的哈希值容易重複。首先考慮調整Hash函數解決衝突,常用解決Hash衝突的方法如:開放地址法、再哈希法、鏈地址法(HashMap採用);其次考慮將HashMap轉化爲平衡數實現的TreeMap形式。

     9.hashCode()與equals()生成算法、方法怎麼重寫

hashCode()用於獲取對象的哈希值,而equals()通過兩個對象的哈希值判斷兩個對象是否相等。重寫原則是:

a)在java應用程序運行時,無論何時多次調用同一個對象時的hsahCode()方法,這個對象的hashCode()方法的返回值必須是相同的一個int值

b)如果兩個對象equals()返回值爲true,則他們的hashCode()也必須返回相同的int值

c)如果兩個對象equals()返回值爲false,則他們的hashCode()返回值也必須不同

     10、UTF-8與GBK區別

UTF-8是用以解決國際上字符的一種多字節編碼,英文使用8位(1Byte),中文用24位(3Byte);

GBK是專門用來解決中文編碼的,不論中英文都是雙字節。

     11、Java中 == 與 equals() 區別

== 表示判斷2個變量或對象實例是否指向同一個內存空間,equals()表示 判斷2個變量或對象實例所指向的內存空間的值是否相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章