以下內容源于個人對《深入java虛擬機》的理解總結
基本概念:
java虛擬機可以指一種抽象規范,也可以指一種具體實現,亦可以指一個java虛擬機實例。
虛擬機生命周期:
一個java虛擬機實例的天職是:負責運行一個java程序。當啟動一個java程序時,一個虛擬機實例誕生。程序關閉退出,虛擬機實例亦隨之消亡。如果在同一臺計算機上運行三個java程序,將得到三個java虛擬機實例。每個java程序都運行與它自己的java虛擬機實例中。
一個java虛擬機實例通過調用main()方法來運行一個java程序。
垃圾收集 垃圾收集器的主要工作就是自動回收不再被運行的程序引用的對象所占的內存。此外它也可能去移動那些還在使用的對象,以此減少碎片。
在談論垃圾回收前,首先了解下java虛擬機的內部體系結構,如下圖所示
中間虛線框部分為運行時數據區域,由5部分組成,分別為方法區,堆,棧,程序計數器及本地方法棧。
1.程序計數器
對于一個運行中的java程序而言,其中每一個線程都有自己的PC寄存器,它是該線程啟動時創建。
它的作用可以看做當前字節碼執行的位置指示器。
2.本地方法棧
任何本地方法接口都會使用本地方法棧。當線程調用本地方法時,虛擬機會創建一個新的棧幀并壓人java棧,然而當它調用的是本地方法時,虛擬機會保持java棧不變,不再在線程的java棧中壓人新的幀。虛擬機只是簡單的動態連接,并直接調用指定的本地方法。
3.方法區
在java虛擬機中,關于被裝載類型的信息存儲在一個邏輯上被稱為方法區的內存中。類變量(靜態變量)也是存儲在方法區。方法區是線程共享的,必須被設計為線程安全的。
4.java棧
當啟動一個新線程時,java虛擬機都會為它分配一個java棧,java棧以幀為單位保存線程的運行狀態。虛擬機只會直接對java棧執行兩種操作:以幀為單位的壓棧和出棧。
某個線程正在執行的方法被稱為該線程的當前方法,當前方法使用的棧幀稱為當前幀,當前方法所屬的類稱為當前類,當前類的常量池稱為當前常量池。
當線程執行一個方法時,它會跟蹤當前類和當前常量池。
java棧上的所有數據都是線程私有的,任何線程都不能訪問另一個線程的棧數據,因此不需要考慮多線程下棧數據的訪問同步問題。
5.java堆
java程序在運行時創建的所有類實例和數組都放在同一個堆中。每個java程序獨占一個虛擬機實例----它們不會互相干擾,而一個java虛擬機實例中只存在一個堆空間,所有線程都共享這個堆,這種情況下,必須考慮多線程情況下堆數據的同步問題。
java類性的生命周期
一個java的裝載、連接、初始化見下圖:
類被初始化后就可以使用了,程序可以訪問它的靜態字段,調用它的靜態方法,或者創建它的實例即對象。
類被實例化有4中途徑:1.顯式的new 2.Class,或Construtor對象的newInstance()方法;3 . 調用任何現有對象的clone()方法 4.ObjectInputStream.getObject()方法反序列化。
一個對象一旦不再被引用,就需要進行垃圾收集。至于how,when進行垃圾收集,取決各虛擬機實現。下面介紹常見hotSpot虛擬機的垃圾回收機制。
文章列表