天天看點

Java經典面試題整理及答案詳解(五)

了解更多:

Java經典面試題整理及答案詳解(一) Java經典面試題整理及答案詳解(二) Java經典面試題整理及答案詳解(三) Java經典面試題整理及答案詳解(四)

Java經典面試題第五彈來啦!本節面試題主要是針對Java初級基礎提問,看看你還記得多少?

1.String str=“hello”,這個字元串對象在棧記憶體中明明有一個引用(str[ox00010]),為什麼還說這個字元串是匿名對象呢?

所謂的字元串是匿名對象,實際上是因為隻要使用了“’’”聲明,那麼就表示将在堆記憶體空間裡面開辟一個新的字元串對象(String對象),這個對象是可以直接使用的,例如:““hello”.length()”。這個時候的字元串由于沒有引用,是以稱為匿名對象,對于此時的代碼“String str=“hello””,已經明确的為str對象進行執行個體化,是以“hello”對應的堆記憶體的位址已經有了明确的棧記憶體指向,就不是匿名對象了。

2.當使用直接指派額的方式執行個體化一個字元串對象的時候,他的引用是儲存在哪裡的?

隻要是引用對象就儲存在堆記憶體裡面,而我們所有能夠進行的記憶體控制,也隻有堆記憶體。

3,對象池(常量池)和棧是什麼關系?

不論是對象池還是常量池,都是儲存在堆記憶體裡面的,而堆記憶體需要進行一些合理的劃分。

Java經典面試題整理及答案詳解(五)

4.不同的作業系統會由軟體和硬體模拟出不同的虛拟機,但是不同的JVM對Java程式度支援,能實作這個功能的原理是不是:虛拟機中定義了類似于接口這樣的操作,接口中定義了類似native抽象方法,然後具體方法的實作交給作業系統去完成?

對于JVM有三種實作标準,這三種實作标準我們使用的是HotSpot虛拟機标準,這個标準的實作不是簡單的調用一些底層函數。它裡面是需要與一些裝置進行互動的,而整個系統設計之中,為了可以讓Java調用函數功能,專門提供有一個native交由JVM負責實作一些具體功能。

5.JVM記憶體優化

(1)JVM優化的第一個問題,取消掉伸縮區,讓total=max;

—— CMS問題,頻繁的CMS會導緻性能下降;

——伊甸園區、存活區、老年代的關系要說明白,JDK1.8之後取消了永久代,而使用元空間代替。

(2)如果你的記憶體過大,要使用GI收集器來進行收集;

(3)在Tomcat裡面由于其使用基于JVM,是以需要設定一個“JAVA OPTS”指令,可以将全部的記憶體供Tomcat使用(預設的最大可用記憶體為全部記憶體的四分之一,預設的total記憶體為全部記憶體的64分之1)。

6.JVM記憶體組成

JVM記憶體組成裡面最為關鍵的幾個記憶體:

(1)棧記憶體:隻是儲存有堆記憶體的引用位址,而且從一個簡單的角度來講,棧記憶體可以儲存基本類型;

(2)堆記憶體:Java沒有采用句柄的模式進行引用,是以它的引用性能是最高的,但是從另外一個角度來講,堆記憶體裡面實際上又分為若幹個子記憶體空間:伊甸園區、存活區、老年代(FullGC、MajorGC);

①原則:少産生無用的大量記憶體空間,因為會引發頻繁的GC,而頻繁的GC會帶來CMS問題,那麼會導緻程式中斷執行,是以這個處理的原則之中對于程式員的要求;

②讓你初始化的空間大小等于整個堆記憶體的配置設定大小,避免伸縮區,這樣可以進行性能的提升;

(3)方法區(JDK1.8以前可以稱為永久代,在JDK1.8之後稱為元空間);

(4)全局資料區也可以認為其規劃在堆記憶體裡面,因為會發現全局資料區中儲存的内容有可能是對象,有可能是基本類型,隻不過它采用了一種特殊的處理形式而已。

在面試中還有可能問到的是堆記憶體的組成以及GC的處理流程。

7.HashMap需要resize時擴容因子是如何得到的?

如果要想解決這個問題還是需要進行源代碼的深入研究,也就是說對于基本的資料結構(類集)。

在進行資料添加的時候這個裡面存在有一個put()方法:

Java經典面試題整理及答案詳解(五)

在put()方法裡面可以發現有一個putVal方法(),而且可以發現這個方法首先進行了hash計算(查找),而後在這個方法的實作定義:

Java經典面試題整理及答案詳解(五)

它的容量擴充指的是一開始放30個,如果發現不夠了,則進行位移處理,302,那麼再一次擴充302*2。

8.說出RuntimeException和非RuntimeException的差別

這裡最容易讓你混淆的隻是一些名詞:

java.lang.Runtime類:是一個具備有單例設計模式的開發類,在每一個JVM的程序中隻會存在一個Runtime類的對象,這個類給我們最大的幫助在于可以取得一些系統資訊或者進行一些程序的處理操作。基本上使用這個類取得一些記憶體資訊或者進行垃圾收集處理。(GC)

Java經典面試題整理及答案詳解(五)

整個JVM記憶體劃分存在伸縮區,面對這樣的問題,為了提升性能,往往會将初始化記憶體與最大記憶體設為相同。(如果不相同,那麼就需要一直進行空間的判斷,而後不斷進行空間的配置設定,這樣操作是比較可怕的。)

Java經典面試題整理及答案詳解(五)

RuntimeException的異常子類不需要強制性處理,可以由使用者選擇性處理,而Exception子類必須進行處理,RuntimeException是Exception子類。

這些問題放在一起,就是為了混淆你的認識,這樣才有的和你談,也是為了考察你的基本功是不是紮實。

9.Java記憶體模型

(1)看你是否是知道Java的記憶體劃分;

(2)看你是否有過具體的工作經驗,因為在實際的開發之中,如果不調整記憶體,那麼性能将會造成極大的浪費;

(3)關于GC的解釋操作。

說到記憶體,可能最直覺的了解就在于Runtime類中,這個類采用了單例設計模式,這個類之中提供了記憶體資訊的取得,以及系統垃圾的收集處理操作。

範例:取得預設的記憶體大小:

Java經典面試題整理及答案詳解(五)
Java經典面試題整理及答案詳解(五)

這三個方法的傳回值類型都是long,是以傳回的資料機關都是位元組。

實際在Java裡面如果想要進行記憶體的變更,就需要掌握一下記憶體的結構(記憶體模型)。

在Java裡面對于記憶體的空間可以劃分為如下幾點:

1.伊甸園區:新生的對象都儲存在此處,但這些新生的對象不一定會一直存活;

此處也屬于記憶體空間,既然是記憶體空間一定會被占滿,如果占滿了,就會執行GC操作;

2.舊生代區:如果某些對象其要一直使用,那麼就将進入到舊生代區,這屬于二級回收保險;

如果要先執行GC,那麼肯定先清理伊甸園區,随後如果發現空間不足,繼續清理舊生代區;

3.永久區:永久區中的資料不會清除,即使程式出現了“OutOfMemoryError”也不會清除。

範例:直覺的觀察記憶體

Java經典面試題整理及答案詳解(五)
Java經典面試題整理及答案詳解(五)
Java經典面試題整理及答案詳解(五)

調整記憶體大小:-Xms2048M-Xmx2048M-Xmn1024M

(1)“-Xms”:初始配置設定的記憶體大小,預設在實體記憶體的64分之1,但是小于1G;

(2)“-Xmx”:最大配置設定記憶體,預設大小為實體記憶體的4分之1,但是小于1G;

(3)“-Xmn”:設定年輕代(伊甸園區)的堆記憶體大小;

隻有調整之後才可以保證系統記憶體會得到提升,這樣很明顯,你就可以發揮出你電腦的性能,因為預設的大小。

更多專業知識,面試技巧就在面試一點通,持續更新中……

感謝浏覽~

本内容來源于

阿裡雲大學-Java面試技巧