1. 程式人生 > 其它 >java面試題集合

java面試題集合

jvm篇

 

javaSource:java原始碼,java類

javaClass:位元組碼,class類

1.java虛擬機器棧記憶體建立main方法主執行緒,程式入口,java 虛擬機發現沒有見過的類,觸發 類載入子系統(把類所有的原始資訊,載入到記憶體中(方法區)包含類名、方法名、成員變數、引用其他類的名字)

2.載入一個類完成後,碰到new一個物件的時候,new的物件資訊儲存到heap堆中(一個物件有多少成員變數,需要多少個位元組多儲存在堆中),而區域性變數、方法引數佔用的是棧記憶體。

3.main主執行緒可能被cpu切換到其他執行緒,使用 程式計數器,記住main主執行緒執行到哪行程式碼。而執行緒佔用的都是棧記憶體。

4.GC垃圾回收被棄用的java物件

5.直譯器把java位元組碼轉換成機器碼,能被cpu所使用。因為這個直譯器所以java可以使用於跨平臺

6.對於反覆呼叫的程式碼,稱之為熱點程式碼,對於這種熱點程式碼,使用JIT及時編譯器,直接去快取中找到相應的機器碼,直接交給cpu執行。

7.程式計數器、棧記憶體 是執行緒私有的。 堆記憶體、方法區,是執行緒共享的。

8.程式計數器不會記憶體溢位; OutOfMemoryError溢位:①物件建立過多,一直沒被GC回收②方法區記憶體溢位,載入的類越來越多,spring框架在執行期間動態產生新的類③ 建立執行緒越來越多,

  長時間執行不銷燬,每個執行緒預設最多1M的棧記憶體

  StackOverflowError溢位:單獨的執行緒內方法呼叫次數過多(例如遞迴呼叫,無線迴圈下去),超過1M之後,就死翹翹了

9.方法區:這只是定義一塊記憶體的名稱、永久代(1.8之前)、元空間(Metaspce1.8之後)是對方法區的具體實現,現在都說叫做元空間。

10.類載入器被回收之後元空間記憶體才會釋放(系統的類載入器一般不會被釋放的....)

11.jvm引數解釋:(堆記憶體)-Xmx 最大記憶體 -Xms 最小記憶體  -Xmn 新生代佔用記憶體(老年代佔用記憶體=最小記憶體-新生代記憶體)

方法區內(新生代和老年代佔用記憶體關係如下圖),其中new 是新生代,新生代又包括伊甸園區、from、to區,其中from=to的記憶體1:1關係

eden區和from區的比例關係使用引數設定就是 -XXSurvivorRatio =8  預設是8:1

-XXNewRatio=2 新生代和老年代的記憶體比例,預設是2:1

伺服器一般設定-Xms、-Xmx 相等以避免在每次 GC 後調整堆的大小