JVM相關問答

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

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

問:類變量和實例變量有什麼區別? 
答:靜態變量是類變量,非靜態變量是實例變量,直白的說,有 static修飾的變量是靜態變量,沒有 static修飾的變量是實例變量。靜態變量存在方法區中,實例變量存在堆內存中。安全

問: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」是由於永久存儲區滿了,這個也很常見,通常在熱發佈的環境中出現,是由於每次發佈應用系統都不重啓,長此以往永久存儲區中的死對象太多致使新對象沒法申請內存,通常從新啓動一下便可。spa


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

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

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

問: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),你的應用能承受這個嗎?而其顯示調用System.gc()只是給虛擬機一個建議,不必定會執行,由於System.gc()在一個優先級很低的線程中執行。 

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

相關文章
相關標籤/搜索