JVM講解(一)

1、JVM的歷史和背景java

2、JVM的執行過程
數組

     JVM在整個JDK中處於在最底層,負責與操做系統交互,用來屏蔽操做系統環境,提供一個完整的java程序運行環境。操做系統裝入JVM是經過jdk中Java.exe來完成的,經過如下四個步驟完成JVM環境的執行 1)、建立JVM裝在環境和配置,2)、裝載JVM.dll 3)、初始化JVM.dll並得到JNIENV接口4)、調用JNIEnv實例裝載並找到類的Main()方法去處理。以下圖所示:
函數

3、JVM的基本結構性能

    一、類裝載器 (classLoader,用來裝載.class文件)操作系統

     二、執行引擎(執行字節碼,或者執行本地方法)
線程

     三、內存空間(方法區、java堆、java棧,本地方法棧)指針

     四、PC寄存器 (用於存儲每一個線程下一步將執行的JVM指令)對象

     五、垃圾回收器
接口

     內存空間和PC寄存器組成了運行時數據區。以下圖所示:內存


        運行時數據區講解:

            一、PC寄存器

                    每一個線程擁有一個寄存器

                    在線程建立時建立

                    用於存儲每一個線程下一步將執行的JVM指令

                    執行native方法時,則PC寄存器不存儲任何信息,值爲undefined

             二、方法區域(method Area)

                    在JDK中這塊區域和永久區(PermanetGeneration)關聯起來,又叫持久代

                    保存類裝載信息(名稱、修飾符等)、類中的靜態變量(static修飾)、final修飾的常量、字段(field)x  信息、方法(method)信息。

                    方法區域是全局共享的,在必定條件下也會被垃圾回收機制回收(GC)

                    方法區內存超出容許大小,會跑出內存溢出(OutOfMemory)錯誤

                三、java堆

                    存儲對象的實例和數組值的區域,能夠認爲全部經過new建立的對象都須要在Java堆內存中分配。

                    GC主要是對堆Heap內存進行回收。

                    全部線程共享java堆,因此在堆上進行對象分配內存都須要加鎖,因此建立對象比較耗時的。

                    

                Sun Hotspot JVM爲了提高對象內存分配的效率,對於所建立的線程都會分配一塊獨立的空間TLAB(Thread Local Allocation Buffer),其大小由JVM根據運行的狀況計算而得,在TLAB上分配對象時不須要加鎖,所以JVM在給線程的對象分配內存時會盡可能的在TLAB上分配,在這種狀況下JVM中分配對象內存的性能和C基本是同樣高效的,但若是對象過大的話則仍然是直接使用堆空間分配

                 TLAB僅做用於新生代的Eden Space,所以在編寫Java程序時,一般多個小的對象比大的對象分配起來更加高效。

                   全部建立的對象都會存儲在新生代對內存中(Yong Generation),若是Yong Generation 在屢次的垃圾回收中(GC在)中存活了下來,這些內存信息將被轉移到Old Generation 中

                    新的對象老是建立在Eden Space

                    堆上分配的空間,每次須要GC 清理空間

                      四、java棧

                            線程私有

                             棧由一系列的幀組成(java棧也叫作幀棧),幀上保存一個方法的局部變量、操做數棧、常量池指針

                              棧中存放的基本類型的變量,以及部分返回結果和stack Frame,非基本類型的對象在JVM棧上存放的是一個指向JVM堆上地址。

                            棧上分配的內存空間,函數(方法)調用完後自動釋放

相關文章
相關標籤/搜索