每日三道面試題,通往自由的道路4——JVM篇

茫茫人海千千萬萬,感謝這一秒你看到這裏。但願個人面試題系列能對你的有所幫助!共勉!java

願你在將來的日子,保持熱愛,奔赴山海!面試

每日三道面試題,成就更好自我

昨天既然你有講到字符串常量池是吧,那這樣吧安全

1. 你能夠講下JVM的運行時數據區或者說內存結構嗎?

咱們能夠分爲線程私有和線程共享的兩種狀況jvm

線程私有:程序計數器,本地方法棧,虛擬機棧ide

線程共享:堆和方法區線程

  • 程序計數器:它佔用了很小的一塊內存空間,記錄的是咱們當前線程的一個執行的行數。由於線程它可能不斷的切換,如何保證到當前線程時,它執行到哪裏呢,就是靠程序計數器來實現的。該內 存區域是惟一一個 Java 虛擬機規範沒有規定任何 OOM 狀況的區域。對象

  • 虛擬機棧:當jvm執行方法時,會在此區域建立棧幀入棧,它存儲方法的各類信息好比局部變量表,操做數棧,動態鏈接,方法放回地址這些信息。blog

  • 本地方法棧:它也虛擬機棧相似,可是它主要爲native方法服務,例如java須要使用c語言的接口服務時。繼承

  • 堆: 也叫 Java 堆或者是 GC 堆,它是一個線程共享的內存區域,也是 JVM 中佔用內存最大的一塊區域,幾乎全部對象都儲存在這裏分配內存,也是垃圾回收期主要的管理區域。接口

  • 方法區:存儲一些被虛擬機加載的類信息,常量,靜態變量,編譯器編譯後的代碼等數據。

不錯不錯,JVM都有了解,那再問你一點吧。

2. 類加載過程

系統加載Class類型文件的主要步驟有加載-->鏈接--> 初始化,鏈接又能夠分爲驗證-->準備-->解析

  • 加載:根據類的全限定名來獲取類的二進制字節流,在內存中生成一個表明該類的Class對象
  • 驗證:主要驗證檢查class文件的正確性,好比文件格式,元數據,字節碼,符號引用的驗證。
  • 準備:主要就是爲類變量分配內存並設置類變量初始的一個階段。
  • 解析:虛擬機將常量池內的符號引用替換成直接引用的一個過程。
  • 初始化:它是類加載的最後一步,就是真正執行類中定義的Java程序代碼的過程。

能夠,那問你最後一道:

3. 而其中類加載器是什麼,那有哪些呢?

對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立在 JVM 中的惟一性,每個類加載器,都有一個獨立的類名稱空間。而類加載器就是根據指定全限定名稱將 class 文件加載到 JVM 內存,而後再轉化爲 class 對象。

主要有一下四種類加載器:

  • 啓動類加載器(BootstrapClassLoader)用來加載java核心類庫,沒法被java程序直接引用。
  • 擴展類加載器(ExtensionClassLoader):它用來加載 Java 的擴展庫。Java 虛擬機的實現會提供一個擴展庫目錄。該類加載器在此目錄裏面查找並加載 Java 類。
  • 應用程序類加載器(ApplicationClassLoader):它根據 Java 應用的類路徑(CLASSPATH)來加載 Java 類。通常來講,Java 應用的類都是由它來完成加載的。能夠經過ClassLoader.getSystemClassLoader()來獲取它。通常狀況,若是咱們沒有自定義類加載器默認就是用這個加載器。
  • 用戶自定義類加載器,咱們能夠自行去經過繼承 java.lang.ClassLoader類的方式實現。

而對於一個類加載的過程當中,若是一個類加載器收到類加載的請求的時候,它首先不會本身去加載這個類,而是把這個請求委派給本身的父類加載器去完成,一直到頂層的啓動類加載器時,只有當父加載沒法完成這一加載請求時,就會往下一層一層的嘗試去加載類。這種模式就是雙親委派模式,這中模式的好處能夠使類有了層次劃分,也保障安全。

小夥子不錯嘛!今天就到這裏,期待你明天的到來,但願能讓我繼續保持驚喜!

注: 若是文章有任何錯誤和建議,請各位大佬盡情留言!

相關文章
相關標籤/搜索