Java虛擬機面試題

 GC垃圾回收,當你內存溢出時,使用回收垃圾時,你的對象真正使用你如何處理,
JVM裝載class文件的機制 
內存溢出問題 
對JVM有多少的瞭解,若是出現內存溢出的時候,我要怎麼辦(申請虛擬內存)? 
你在項目中用反射了嗎?反射是怎麼實現的? 
堆與棧的區別? 
垃圾回收(gc)幹什麼的?
內存溢出是什麼? 
classload怎麼加載class 
class.forname的好處   
類的加載過程,順序 
內存溢出怎麼解決 
Java代碼裏怎麼提升系統性能. 。
GC 是什麼? 爲何要有 GC? 
怎麼加大JDK的虛擬內存 
classLoader以及實現機制 
還有反射的原理 
什麼放在堆裏什麼放在棧裏 
GC哪麼實現的, 
new出來的對象是放在堆裏仍是棧裏? java

 

問:堆和棧有什麼區別堆和棧有什麼區別有什麼
答:堆是存放對象的,可是對象內的臨時變量是存在棧內存中,如例子中的 methodVar 是在運
行期存放到棧中的。
棧是跟隨線程的,有線程就有棧,堆是跟隨 JVM 的,有 JVM 就有堆內存。


問:堆內存中到底存在着什麼東西?堆內存中到底存在着什麼東西?
答:對象,包括對象變量以及對象方法。


問:類變量和實例變量有什麼區別?類變量和實例變量有什麼區別?有什麼區別
答:靜態變量是類變量,非靜態變量是實例變量,直白的說,有 static 修飾的變量是靜態變量,
沒有 static 修飾的變量是實例變量。靜態變量存在方法區中,實例變量存在堆內存中。
     啓動時就初始化好的,和你這說的不一樣呀!


問:我據說類變量是在 JVM 啓動時就初始化好的,和你這說的不一樣呀!
答:那你是道聽途說,信個人,沒錯。
     的方法(函數)究竟是傳值仍是傳址值仍是傳址?


問:Java 的方法(函數)究竟是傳值仍是傳址?
答:都不是,是以傳值的方式傳遞地址,具體的說原生數據類型傳遞的值,引用類型傳遞的地
址。對於原始數據類型,JVM 的處理方法是從 Method Area 或 Heap 中拷貝到 Stack,而後運行 frame
中的方法,運行完畢後再把變量指拷貝回去。
             產生?


問:爲何會產生 OutOfMemory 產生?
答:一句話:Heap 內存中沒有足夠的可用內存了。這句話要好好理解,不是說 Heap 沒有內存
了,是說新申請內存的對象大於 Heap 空閒內存,好比如今 Heap 還空閒 1M,可是新申請的內存需
要 1.1M,因而就會報 OutOfMemory 了,可能之後的對象申請的內存都只要 0.9M,因而就只出現
一次 OutOfMemory,GC 也正常了,看起來像偶發事件,就是這麼回事。 但若是此時 GC 沒有回
收就會產生掛起狀況,系統不響應了。


問:我產生的對象很少呀,爲何還會產生 OutOfMemory?我產生的對象很少呀,?
答:你繼承層次忒多了,Heap 中 產生的對象是先產生 父類,而後才產生子類,明白不?
            錯誤分幾種?問:OutOfMemory 錯誤分幾種?
答:分兩種,分別是「OutOfMemoryError:java heap size」和」OutOfMemoryError: PermGen
space」,兩種都是內存溢出,heap size 是說申請不到新的內存了,這個很常見,檢查應用或調整
堆內存大小。
「PermGen space」是由於永久存儲區滿了,這個也很常見,通常在熱發佈的環境中出現,是
由於每次發佈應用系統都不重啓,長此以往永久存儲區中的死對象太多致使新對象沒法申請內存,
通常從新啓動一下便可。


問:爲何會產生 StackOverflowError??
答:由於一個線程把 Stack 內存所有耗盡了,通常是遞歸函數形成的。
         之間能夠互訪嗎?


問:一個機器上能夠看多個 JVM 嗎?JVM 之間能夠互訪嗎?
答:能夠多個 JVM,只要機器承受得了。JVM 之間是不能夠互訪,你不能在 A-JVM 中訪問
B-JVM 的 Heap 內存,這是不可能的。在之前老版本的 JVM 中,會出現 A-JVM Crack 後影響到
B-JVM,如今版本很是少見。
      要採用垃圾回收機制,的顯式


問:爲何 Java 要採用垃圾回收機制,而不採用 C/C++的顯式內存管理?的顯 內存管理?
答:爲了簡單,內存管理不是每一個程序員都能折騰好的。


問:爲何你沒有詳細介紹垃圾回收機制?爲何你沒有詳細介紹垃圾回收機制
答:垃圾回收機制每一個 JVM 都不一樣,JVM Specification 只是定義了要自動釋放內存,也就是
說它只定義了垃圾回收的抽象方法,具體怎麼實現各個廠商都不一樣,算法各異,這東西實在不必
深刻。
    中到底哪些區域是共享的?哪些是私有的?


問:JVM 中到底哪些區域是共享的?哪些是私有的?
答:Heap 和 Method Area 是共享的,其餘都是私有的,


問:什麼是 JIT,你怎麼沒說?,你怎麼沒說?
答:JIT 是指 Just In Time,有的文檔把 JIT 做爲 JVM 的一個部件來介紹,有的是做爲執行引
擎的一部分來介紹,這都能理解。Java 剛誕生的時候是一個解釋性語言,別噓,即便編譯成了字
節碼(byte code)也是針對 JVM 的,它須要再次翻譯成原生代碼(native code)才能被機器執行,於
是效率的擔心就提出來了。Sun 爲了解決該問題提出了一套新的機制,好,你想編譯成原生代碼,
沒問題,我在 JVM 上提供一個工具,把字節碼編譯成原生碼,下次你來訪問的時候直接訪問原生
碼就成了,因而 JIT 就誕生了,就這麼回事。
    還有哪些部分是你沒有提到的?


問:JVM 還有哪些部分是你沒有提到的?
答:JVM 是一個異常複雜的東西,寫一本磚頭書都不爲過,還有幾個要說明的:
常量池(constant pool)按照順序存放程序中的常量,:而且進行索引編號的區域。好比 int i =100,
這個 100 就放在常量池中。
安全管理器(Security Manager):提供 Java 運行期的安全控制,防止惡意攻擊,好比指定讀取
文件,寫入文件權限,網絡訪問,建立進程等等,Class Loader 在 Security Manager 認證經過後才
能加載 class 文件的。
方法索引表(Methods table),記錄的是每一個 method 的地址信息,Stack 和 Heap 中的地址指針
實際上是指向 Methods table 地址。


問:爲何不建議在程序中顯式的生命 System.gc()??
答:由於顯式聲明是作堆內存全掃描,也就是 Full GC,是須要中止全部的活動的(Stop The
World Collection),你的應用能承受這個嗎?


問:JVM 有哪些調整參數?
答:很是多,本身去找,堆內存、棧內存的大小均可以定義,甚至是堆內存的三個部分、新生
代的各個比例都能調整。程序員

相關文章
相關標籤/搜索