JVM基本原理

本文參照百度百科以及該地址內容的簡化https://www.cnblogs.com/lishun1005/p/6019678.html

一、什麼是java?

java是一門技術,他包括四個方面:java編程語言、java類文件格式、java虛擬機(JVM)和java應用程序接口(java API)

二、什麼是JVM?

jvm是java虛擬機的縮寫,JVM是一種用於計算設備的一種規範,它是一個虛擬出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。

java虛擬機是實現java語言與平臺無關性的關鍵。一般的高級語言如果在不同的平臺運行,至少需要編譯成不同的目標代碼,而java虛擬機引入後,java語言在不同平臺運行的時候不需要重新編譯,java語言使用java虛擬機屏蔽了與平臺相關的具體信息,從而使得java語言編譯程序只需要生成java虛擬機上運行的代碼(字節碼),就可以在多個平臺不加修改的運行。java虛擬機執行字節碼的時候,把字節碼解釋成具體平臺的相應的機器指令執行,這就是java語言與平臺無關的關鍵所在,也是java能夠實現“一次編譯,到處運行”的原因。

三、JVM內存管理及垃圾回收機制

JVM內存結構分爲:方法區(method)、棧內存(stack)、堆內存(heap)、本地方法棧。

方法區:

保存方法代碼(編譯後的java代碼)和符號表,存放了要加載的類信息,靜態變量,final類型的常量,屬相和方法信息。

棧內存:

在Windows下,棧是低地址擴展的數據結構,是一塊連續的內存區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先設定好的,在Windows下,棧的大小是固定的(是一個編譯時就確定的常數),如果申請的空間超出棧的剩餘空間,將提示overflow。因此能從棧獲得的空間較小,只有棧的剩餘空間大於申請空間,系統將爲程序提供內存,否則將報異常提示棧溢出。由系統自動分配,速度較快。但程序員無法控制。

堆內存:

所有通過new創建的對象的內存都在堆中分配。

操作系統有一個記錄空閒內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣代碼中的delete語句才能正確的釋放本內存空間。但由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鏈表中。這時由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便。另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,它不是在堆,也不是在棧,而是直接在進程的地址空間中保留一塊內存,雖然這種方法用起來最不方便,但是速度快,也是最靈活的。堆內存是向高地址擴展的數據結構,是不連續的內存區域。由於系統是用鏈表來存儲的空閒內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

堆內存與棧內存需要說明:

基礎數據類型直接在棧空間分配,方法的形式參數,直接在棧空間分配,當方法調用完成後從棧空間回收。引用數據類型,需要用new來創建,既在棧空間分配一個地址空間,又在堆空間分配對象的類變量 。方法的引用參數,在棧空間分配一個地址空間,並指向堆空間的對象區,當方法調用完成後從棧空間回收。局部變量new出來時,在棧空間和堆空間中分配空間,當局部變量生命週期結束後,棧空間立刻被回收,堆空間區域等待GC回收。方法調用時傳入的literal參數,先在棧空間分配,在方法調用完成後從棧空間收回。字符串常量、static在DATA區域分配,this在堆空間分配。數組既在棧空間分配數組名稱,又在堆空間分配數組實際的大小。

本地方法棧:(java的jni調用)

用於支持native方法的執行,存儲了每個native方法調用的狀態。對於本地方法接口,實現JVM並不要求一定要有它的支持,甚至可以完全沒有。Sun公司實現Java本地接口(JNI)是出於可移植性的考慮,當然我們也可以設計出其它的本地接口來代替Sun公司的JNI。但是這些設計與實現是比較複雜的事情,需要確保垃圾回收器不會將那些正在被本地方法調用的對象釋放掉。

垃圾回收機制:

堆裏聚集了所有由應用程序創建的對象,JVM也有對應的指令比如 new, newarray, anewarray和multianewarray,然並沒有向 C++ 的 delete,free 等釋放空間的指令,Java的所有釋放都由 GC 來做,GC除了做回收內存之外,另外一個重要的工作就是內存的壓縮,這個在其他的語言中也有類似的實現,相比 C++ 不僅好用,而且增加了安全性,當然她也有弊端,比如性能這個大問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章