Java经典面试题整理及答案详解(五)
Java經典面試題第五彈來啦!本節面試題主要是針對Java初級基礎提問,看看你還記得多少?
1.String str=“hello”,這個字符串對象在棧內存中明明有一個引用(str[ox00010]),為什么還說這個字符串是匿名對象呢?
所謂的字符串是匿名對象,實際上是因為只要使用了“’’”聲明,那么就表示將在堆內存空間里面開辟一個新的字符串對象(String對象),這個對象是可以直接使用的,例如:““hello”.length()”。這個時候的字符串由于沒有引用,所以稱為匿名對象,對于此時的代碼“String str=“hello””,已經明確的為str對象進行實例化,所以“hello”對應的堆內存的地址已經有了明確的棧內存指向,就不是匿名對象了。
2.當使用直接賦值額的方式實例化一個字符串對象的時候,他的引用是保存在哪里的?
只要是引用對象就保存在堆內存里面,而我們所有能夠進行的內存控制,也只有堆內存。
3,對象池(常量池)和棧是什么關系?
不論是對象池還是常量池,都是保存在堆內存里面的,而堆內存需要進行一些合理的劃分。
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()方法:
在put()方法里面可以發現有一個putVal方法(),而且可以發現這個方法首先進行了hash計算(查找),而后在這個方法的實現定義:
它的容量擴充指的是一開始放30個,如果發現不夠了,則進行位移處理,302,那么再一次擴充302*2。
8.說出RuntimeException和非RuntimeException的區別
這里最容易讓你混淆的只是一些名詞:
java.lang.Runtime類:是一個具備有單例設計模式的開發類,在每一個JVM的進程中只會存在一個Runtime類的對象,這個類給我們最大的幫助在于可以取得一些系統信息或者進行一些進程的處理操作。基本上使用這個類取得一些內存信息或者進行垃圾收集處理。(GC)
整個JVM內存劃分存在伸縮區,面對這樣的問題,為了提升性能,往往會將初始化內存與最大內存設為相同。(如果不相同,那么就需要一直進行空間的判斷,而后不斷進行空間的分配,這樣操作是比較可怕的。)
RuntimeException的異常子類不需要強制性處理,可以由用戶選擇性處理,而Exception子類必須進行處理,RuntimeException是Exception子類。
這些問題放在一起,就是為了混淆你的認識,這樣才有的和你談,也是為了考察你的基本功是不是扎實。
9.Java內存模型
(1)看你是否是知道Java的內存劃分;
(2)看你是否有過具體的工作經驗,因為在實際的開發之中,如果不調整內存,那么性能將會造成極大的浪費;
(3)關于GC的解釋操作。
說到內存,可能最直觀的理解就在于Runtime類中,這個類采用了單例設計模式,這個類之中提供了內存信息的取得,以及系統垃圾的收集處理操作。
范例:取得默認的內存大小:
這三個方法的返回值類型都是long,所以返回的數據單位都是字節。
實際在Java里面如果想要進行內存的變更,就需要掌握一下內存的結構(內存模型)。
在Java里面對于內存的空間可以劃分為如下幾點:
1.伊甸園區:新生的對象都保存在此處,但這些新生的對象不一定會一直存活;
此處也屬于內存空間,既然是內存空間一定會被占滿,如果占滿了,就會執行GC操作;
2.舊生代區:如果某些對象其要一直使用,那么就將進入到舊生代區,這屬于二級回收保險;
如果要先執行GC,那么肯定先清理伊甸園區,隨后如果發現空間不足,繼續清理舊生代區;
3.永久區:永久區中的數據不會清除,即使程序出現了“OutOfMemoryError”也不會清除。
范例:直觀的觀察內存
調整內存大小:-Xms2048M-Xmx2048M-Xmn1024M
(1)“-Xms”:初始分配的內存大小,默認在物理內存的64分之1,但是小于1G;
(2)“-Xmx”:最大分配內存,默認大小為物理內存的4分之1,但是小于1G;
(3)“-Xmn”:設置年輕代(伊甸園區)的堆內存大小;
只有調整之后才可以保證系統內存會得到提升,這樣很明顯,你就可以發揮出你電腦的性能,因為默認的大小。
更多專業知識,面試技巧就在面試一點通,持續更新中……
感謝瀏覽~
本內容來源于阿里云大學-Java面試技巧
總結
以上是生活随笔為你收集整理的Java经典面试题整理及答案详解(五)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java经典面试题整理及答案详解(四)
- 下一篇: 企业云上安全事件突发,这五个问题值得运维