理解JVM运行原理
做java開發兩年多了,一直沒有深入研究過jvm運行原理,只是依稀的記得內存分為堆內存、棧內存,然后就是哪來著分為新生代和老生代,還有本地方法區,以前覺得這些東西面試用用也就算了,現在想來,不研究研究就不會有進步的,只顧復制粘貼不是出路,深入原理才是王道。
首先看到虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這臺虛擬的機器在任何平臺上都提供給編譯程序一個的共同的接口。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然后由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。
這個就是虛擬機的概念了,我原來的理解就是我的java代碼 ->虛擬機->class文件->虛擬機->執行。但是不是這樣的,虛擬機并不是生成class文件的而是一個運行環境,把class文件轉換為特定系統的機器碼。所以執行過程是java代碼->編輯器(jdk)->class文件->虛擬機(jre)->特定系統機器碼->執行。
虛擬機的工作主要分為以下3個步驟:裝載、鏈接、初始化。
裝載:把class文件讀進虛擬機然后生成這個class的實例對象,大致過程就是類加載器找到class讀到虛擬機當中,虛擬機讀取class的類信息:類名、方法(名字、返回類型、參數列表)、變量、修飾符和常量池,一個類型的所有常量和符號引用都存放到方法區,然后生成實例對象存放在堆內存。
鏈接:驗證語義、分配類變量內存、解析(在類型的常量池中尋找類,接口,字段和方法的符合引用把這些符號引用替換成直接引用的過程。)
初始化:初始化類的一些靜態變量。
內存是分為四個區的:方法區、堆內存、棧內存和代碼區。
類裝載的時候:static塊或常量等class的唯一標示會放在方法區當中。也就是說表明這個class是唯一的就是在方法區中保存的。還會產生一個空對象存放在堆內存,當new 一個對象出來的時候,其實就是在堆內存當中拷貝一個對象,當然還是存放到堆內存當中的,然后棧內存干啥的呢,其實棧內存是一個線程保持一個的,換句話說也就是一個人一個棧內存誰也別搶,堆內存相對就是共享的,棧內存存放基本數據類型和引用數據類型,引用數據就是直接指向了棧內存的類對象了。至于代碼區,存放的是class二進制數據了吧。
總結
- 上一篇: activeMQ使用总结
- 下一篇: mavengradle 依赖指定版本范围