JVM 類型的生命周期學習

Java虛擬機通過裝載、連接和初始化一個JAVA類型,使該類型可以被正在運行的JAVA程序所使用,其中,裝載就是把二進制形式的JAVA類型讀入JAVA虛擬機中;而連接就是把這種讀入虛擬機的二進制形式的類型數據合并到虛擬機的運行時狀態中去。

連接階段分為三個子步驟----驗證、準備和解析

"驗證"步驟確保了JAVA類型數據格式正確并且適用于JAVA虛擬機使用。

"準備"步驟負責為該類型分配它所需的內存,比如為它的類變量分配內存。

"解析"步驟則負責把常量池中的符號引用轉換為直接引用。

虛擬機的實現可以推遲解析這一步,它可以在當運行中的程序真正使用某個符號引用時再去解析它(把該符號引用轉換為直接引用)。當驗證、準備和(可選的)解析步驟都完成了時,該類型就已經為初始化做好了準備。在初始化期間都將給變量賦以適當的初始值。

?

所有的JAVA虛擬機實現必須在每個類或接口首次主動使用時初始化。下面這六種情況符合主動使用的要求。

(1)當創建某個類的新實例時(或通過在字節碼中執行new指令;或者通過不明確的創建、反射、克隆或者反序列化)

(2)當調用某個類的靜態方法時(即在字節碼中執行invoke、static指令時)

(3)當使用某個類或接口的靜態字段,或者對該字段賦值時,用final修飾的靜態字段除外,它被初始化為一個編譯時的常量表達式。

(4)當調用JAVA API中的某些反射方法時,比如類CLASS中的方法或者java.lang.reflect包中的類方法。

(5)當初始化某個類的子類時(某個類初始化時,要求它的超累已經被初始化了)

(6)當虛擬機啟動時被表名為啟動類的類(即含有main()方法的那個類)

?

裝載

裝載階段由三個基本動作組成,要裝載一個類型,JAVA虛擬機必須:

(1)通過該類型的完全限定名,產生一個代表該類型的二進制數據流。

(2)解析這個二進制數據流為方法去內的內部數據結構。

(3)創建一個表示該類型的java.lang.Class類的實例。

驗證

當類型被裝載后,就準備進行連接了。連接過程的第一步是驗證---確認類型符合JAVA語言的語義,并且它不會危及虛擬機的完整性。檢查被裝載的類型是否有任何問題的整個過程都屬于驗證。

另一個很可能在裝載時進行的檢查是,確保除了Object之外的每一個類都有一個超類。在裝載時檢查的原因是當虛擬機裝載一個類時,它必須確保該類的所有超類都已經被裝載了

在大部分虛擬機實現中,還有一種檢查往往發生在正式的驗證階段之后,那就是符號引用的驗證。在前面的章節中描述過,動態連接的過程包括通過保存在常量池中的符號引用查找被引用的類、接口、字段以及方法,把符號引用替換成直接引用。當虛擬機搜尋一個被符號引用的(類型、字段或方法)時,它必須首先確認該元素存在。

?

在正式的驗證階段需要完成的候選檢查在下面列出:

(1)檢查final的類不能擁有子類。

(2)檢查final的方法不能被覆蓋。

(3)確保在類型和超類型之間沒有不兼容的方法聲明(比如兩個方法擁有相同的名字,參數再數量、順序、類型上都相同,但是返回類型不同)這里超類需要在子類初始化前被初始化。

(4)檢查所有的常量池入口相互之間一致。

(5)檢查字節碼的完整性。

(6)檢查常量池中的所有的特殊字符串是否符合格式。

?

準備

在準備階段,JAVA虛擬機為類變量分配內存,設置默認初始值。但在到達初始化階段之前,類變量都沒有被初始化為真正的初始值。JAVA虛擬機實現可能也為一些數據結構分配內存,目的是提高運行程序的性能。這種數據結構的雷子如方法表,它包含指向類中每一個方法(包括從超類繼承的方法)的指針。

?

解析

類型經過了連接的前兩個階段---之后,它就可以進入解析階段。解析過程是在類型的常量池中尋找類、接口、字段和方法的符號引用,把這些符號引用替換成直接引用的過程。

?

初始化

一個類包含兩個步驟:

1、如果累存在直接超類的話,且直接超類還沒有被初始化,就先初始化直接超類。

2、如果累存在一個類初始化方法,就執行此方法。

當初始化一個類的直接超類的時候,也就是包含這兩個步驟。因此,第一個初始化的類永遠是Object,然后被主動使用的類的繼承樹上的所有類。超類總是在子類之前被初始化。

JAVA虛擬機必須確保初始化過程被正確的同步。如果多個線程需要初始化一個類,僅僅允許一個線程來執行初始化,其他的線程需要等待。當活動的線程完成了初始化過程之后,它必須通知其他的等待的線程。

?

卸載類型

虛擬機創建并初始化對象,使程序能使用對象,然后在對象變得不再被引用后可選地執行垃圾收集。同樣,虛擬機裝載、連接并初始化類,使程序能使用類,當程序不在引用它們的時候可選地卸載它們。

垃圾收集器必須從可觸及的myThread類的對象,通過它在方法去中的類型數據找到可觸及的CLASS實例。

從MyThread對象開始,垃圾收集器跟隨一個指向MyThread的類型數據的指針,它找到了:

一個指向堆中的MyThread的Class實例的引用。

一個指向MyThread的直接超接口Cloneable的類型數據的指針。

一個指向MyThread的直接超類Thread的類型數據的指針。

從Cloneable的類型數據開始,垃圾收集器找到了:

一個指向堆中Cloneable的Class實例的引用

從Thread的類型數據開始,垃圾收集器找到了:

一個指向堆中Thread的Class實例的引用。

一個指向Thread的直接超接口Runnable的類型數據的指針。

一個指向Thread的直接超類Object的類型數據的指針。

從Runnable的類型數據開始,垃圾收集器找到了:

一個指向堆中Runnable的Class實例的引用。

從Object的類型數據開始,垃圾收集器找到了:

一個指向堆中Object的Class實例的引用。

僅僅一個可觸及的MyThread的實例,垃圾收集器就可以觸及MyThread和它所有超類型的Class實例。

?

參考:《深入java虛擬機》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284896.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js對象數組中的某屬性值 拼接成字符串

var arr[{id: "600", pId: null, name: "圖形的變化"},{id: "630", pId: "600", name: "投影與視圖"},{id: "631", pId: "630", name: "投影"},{id: "632", pId: "630",…

898A. Rounding#數的舍入

題目出處&#xff1a;http://codeforces.com/problemset/problem/898/A 題目大意&#xff1a;找一個數最近的整十的數 #include<iostream> using namespace std; int main(){int a,b;cin>>a;ba;while(1){if(a%100){cout<<a<<endl;return 0;}if(b%100){…

開店星簡直就是國內優秀的開源商城系統天花板

一、場景 1、大學生畢業設計做商城系統背景 好家伙、又到開學季節了&#xff0c;師妹讓我幫忙給指導大四的項目&#xff0c;作為畢業設計和為后面找工作積累項目經驗&#xff0c;要搞一個買賣二手閑置品的商城小程序和PC端商城、希望能夠快速學習、接入、修改部分功能&#xff…

【CASS精品教程】CASS9.1土方量的計算方法匯總

CASS9.1中,計算土方量的方法有:DTM法土方計算、斷面法進行土方量計算、方格網法土方計算、等高線法土方計算、區域土方量平衡等。本文以案例的形式,詳細講解土方量的計算過程。 文章目錄 一、DTM法土方計算二、斷面法進行土方量計算三、方格網法土方計算四、等高線法土方計算…

html標簽缺省(自帶)樣式大全

html標簽默認樣式整理 作者&#xff1a;佚名 來源&#xff1a;互聯網 時間&#xff1a;07-30 16:54:48 文為大家整理了html標簽默認樣式屬性及瀏覽器默認樣式等等&#xff0c;喜歡css布局的朋友們可以學下&#xff0c;希望對大家有所幫助html, address,blockquote,body, dd, …

VS2019 禁止Web項目停止調試后自動關閉瀏覽器(在瀏覽器窗口關閉時停止調試程序,在調試停止時關閉瀏覽器)

很多文章都說要修改以下兩處與“編輯并繼續”有關的選項&#xff1a; “編輯并繼續”是一種省時的功能&#xff0c;使你能夠在程序處于中斷模式時更改源代碼。 通過選擇執行命令&#xff08;如 "繼續" 或 "單步執行"&#xff09;繼續執行程序時&#xff0c…

iOS - block變量捕獲原理

block對變量的捕獲 1&#xff1a;可以捕獲不可以修改變量 局部變量2&#xff1a;可以捕獲且可以修改變量 全局變量靜態變量__block修飾的局部變量原理分析&#xff1a; 1. 局部變量為什么可以被捕獲確不能修改 int a 10; void (^blcok)() [^{NSLog("%d",a); } copy…

Shell 更好看的回顯

#!/bin/shsource /etc/init.d/functionsaction "hello" /bin/true轉載于:https://blog.51cto.com/itech/1768218

【ArcGIS風暴】ArcGIS中等高線高程標注/注記(打斷/消隱)方法案例匯總

本文以案例的形式,圖文并茂詳細講解在ArcGIS 10.6中,等高線高程標注、注記的方法。 文章目錄 一、屬性標注二、Maplex工具標注1. 使用Maplex標注引擎2. 標注轉換為注記3. 要素輪廓線掩膜4. 使用掩膜選項進行繪制參考閱讀: 【CASS精品教程】CASS9.1等高線的繪制完整案例教程 …

Blazor University (35)表單 —— 編寫自定義驗證

原文鏈接&#xff1a;https://blazor-university.com/forms/writing-custom-validation/編寫自定義驗證源代碼[1]請注意&#xff0c;與有關 EditContext、FieldIdentifiers 和 FieldState[2] 的部分一樣&#xff0c;這是一個高級主題。如前所述&#xff0c;FieldState 類保存表…

HTML 元素內部添加預加載

CSS&#xff1a; /*元素內部加載loading*/.innerLoading {height: 100%;width: 100%;display: flex;justify-content: center;align-items: center;}.innerLoading * {text-align: center;color: #737782cc;fill: #73777A;font-size: 1em !important;font-family: SimSun,SimHe…

Windows下怎樣安裝Tomcat

Tomcat 是開源的WEB應用容器&#xff0c;所以受到各位程序員和公司的親賴。在這里給大家介紹一下如何在Windows環境下安裝Tomcat綠色版本&#xff0c;希望能夠對大家有幫助。 1.首先去Tomcat官網下載Tomcat軟件&#xff0c;在百度中搜索Tomcat,進入英文網址http://tomcat.apach…

智能識別云服務端平臺之神【合合信息TextIn】

一、前言 眾所周知&#xff0c;隨著互聯網和人工智能的發展&#xff0c;我們非常多的場景需要用到智能“識別”功能&#xff0c;比如人臉識別、通用文字識別、表格識別、辦公文檔識別、身份證、名片、營業執照等國內外卡證文字識別等等&#xff0c;同時識別與理解面臨的全球性技…

【ArcGIS微課1000例】0015:ArcGIS如何創建/自定義快捷鍵?

為了提高工作效率,強大的ArcGIS提供了很多快捷鍵,如訪問 ArcMap 菜單命令、窗口操縱、刷新或暫停地圖繪制、通過拖放進行移動或復制等等。本文在ArcGIS已有快捷鍵的基礎之上,為了提高工作效率,講解如何定制個性化的快捷鍵。 參考閱讀:【ArcGIS風暴】ArcGIS快捷鍵大全 文章…

Bresenham 算法

1965 年&#xff0c;Bresenham 為數字繪圖儀開發了一種繪制直線的算法&#xff0c;該算法同樣使用于光柵掃描顯示器&#xff0c;被稱為 Bresenham 算法。 原理 算法的目標是選擇表示直線的最佳光柵位置。Bresenhan 算法在主位移方向上每次遞增一個單位。另一個方向的增量為 0…

Python高級特性——迭代(Iteration)

Python高級特性——迭代&#xff08;Iteration&#xff09; 1、給定一個集合list或者tuple&#xff0c;可以通過for …… in ……的語法來實現循環遍歷&#xff0c;這個循環我們就叫做迭代 迭代list&#xff1a; >>> m [haha,hehe,heihei,gaga] >>> for li …

ML.NET 更新

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;5分鐘)ML.NET是一款面向.NET開發人員的開源&#xff0c;跨平臺機器學習框架&#xff0c;可以將自定義機器學習集成到.NET應用中。我們很開心地向您介紹我們在過去幾個月中所做的工作。ML.NET:https://dotnet.microsof…

Andriod之提示java.lang.SecurityException: getDataNetworkTypeForSubscriber導致程序奔潰

1、問題 修改targetSdkVersion 33 適配Android13后4G網絡環境被其它app拉起來提示這個異常 2、原因 我們定位到代碼在這行函數 telephonyManager.getNetworkType()Android11 的權限有關,由于缺少該權限導致無法訪問接口而提示安全異常 3、解決辦法 方法1:我們直接申請RE…

js-權威指南學習筆記7

第七章 數組 1、數組直接量的語法允許有可選的結尾的逗號&#xff0c;所以[ , , ]只有兩個元素而非三個。 2、調用構造函數Array&#xff08;&#xff09;創建數組時&#xff0c;傳入一個參數時表示指定數組的長度。 3、所有的索引都是屬性名&#xff0c;但只有在0~2^32-2之間的…

[譯]基于GPU的體渲染高級技術之raycasting算法

[譯]基于GPU的體渲染高級技術之raycasting算法 PS&#xff1a;我決定翻譯一下《Advanced Illumination Techniques for GPU-Based Volume Raycasting》。像我翻譯其他資料一樣&#xff0c;只按我的需要和觀點來翻譯。有的部分詳細翻譯&#xff0c;附加注解&#xff0c;有的部分…