在類中用class時數據是共有還是私有_jvm學習筆記之class文件的加載、初始化

5d1ffda1542c6c67ea8627ae2798af8b.png

編寫的java文件在要真正運行時,會首先被編譯成 “.class"結尾的二進制文件,然后被虛擬機加載。那么在虛擬機中一個class文件要成為java實例,需要經歷好幾個步驟:

1、裝載:裝載階段由三個基本動作完成,要裝載一個類型,java虛擬機必須:

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

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

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

***當時用new關鍵字創建一個對象時,該類的數據結構存放在方法區中,new出的對象存放在堆中

二進制的數據流可由以下方式產生:

1、從本地加載一個java class 文件

2、通過網絡上下載一個class文件

3、從一個zip、jar、或者其他文檔中提取class文件 等…

2、驗證:類被裝載后,就要準備連接,連接的第一步是驗證——確認類型符合java語言規范,并且不會危及虛擬機的完整性。

類型的檢查——確保除了Object之外的每個類都必須有一個超類,并確保該類的所有超類都已經被裝載了

類之間的二進制兼容檢查——檢查final類不能用于子類、檢查final類的方法不能被覆蓋、確保子類和超類之間沒有不兼容的方法

——檢查所有的常量池入口相互之間一致

——檢查常量池中的所有特殊字符串是否符合格式

——檢查字節碼的完整性(最為復雜的一步)

3、準備:在準備階段java虛擬機為類變量分配內存,設置默認初始值,但在到達初始化之前,類變量都沒有被初始化為真正的初始值。即:我們在類中聲明 int a = 3;但在這一步,a的致被賦予類型的默認值 0 int a =0;java虛擬機不支持boolean 類型,在內部,boolean變量會被默認的設置為int類型的0,即初始化成false.

4、解析:經過驗證和準備之后,就進入了解析過程。解析就是在類型的常量池中尋找類、接口、字段、以及方法的符號引用,把這些引用替換成為直接引用的過程

5、初始化:初始化就是賦予一個變量真正的初始值

如我們定義 private static int a=1; 此時就是給a賦值1

二、動態鏈接和解析

class文件把所有的符號引用保存在——常量池中,每一個 class文件都有一個常量池。每一個被虛擬機裝載類或者接口 都有一個內部版本的常量池,被稱為運行時常量池。

常量池的解析——當程序運行時,某個特定的符號引用要被使用, 首先要被解析。解析過程就是根據 符號引用查找到實體, 在把符號引用替換成為 直接引用的過程。每個符號引用都只被解析一次

早解析——預先解析所有的符號引用,從初始類開始,到后續的各個類,知道所有的符號引用都被解析。

遲解析——在訪問每一個符號引用的最后一刻才去解析。(也可選擇兩種情況之間的折衷策略)

——程序執行都是在第一次 實際訪問一個符號引用時才會拋出錯誤,對于用戶來說,看上去都是 遲解析

——java虛擬機會把所有具有相同字符串順序的字符串文字處理成一個String對象。即:如果有多個類使用同一個字符串“Hello”,java虛擬機只會創建一個具有“Hello ”值的String對象 來表示所有的字符串文字。

——任何的byte、short、char的值在被壓入棧中時, 都會先被轉換成int型

——涉及byte、short、char的運算操作會首先把他們都轉換成int類型,進行計算然后得到int結果,如果需要byte等結果,需要進行顯示轉換。

——java虛擬機中內存只能以對象形式在堆中進行分配,如果需要可考慮基本類型包裝器

——java所使用的同步機制是監視器,java中的監視器支持兩種線程:互斥和協作。java虛擬機是通過鎖來實現互斥,是通過Object的wait和notify方法來實現協作

——只有當絕對確定等待區中只有一個線程掛起的時候才應使用notify,只要存在同時有多個線程掛起的可能性,就應該使用notify all。否則可能導致某個特定的線程在等待區中等待時間過長,甚至永遠就不會蘇醒。

——堆和方法區是被所有線程共享的

——會被多線程訪問的兩種數據:保存在堆中的實例變量,保存在方法區中的類變量

——不需要進行保護的變量:java棧中的局部變量,該數據是擁有該線程的線程私有的

——當虛擬機裝載一個class文件的時候,會創建一個java.lang.Class類的實例。當鎖住一個類的時候,其實就是鎖住那個類的Class對象。

jvm內置的三大類加載器

BootStrap類加載器(BootStrapClassLoader):根類加載器。該加載器沒有父加載器,負責加載虛擬機的核心類庫,如:java.lang.*等,java.lang.Object就是由根加載器加載的

Extension 類加載器(ExtClassLoader):它的父加載器為根加載器,也就是上面那個。它從java.ext.dirs系統屬性所指定的目錄中加載類庫,或者從jdk的安裝目錄jre/lib/ext子目錄中加載類庫。該類是純java類是lava.lang.ClassLoader類的子類

System系統類加載器(AppClassLoader),也稱為應用類加載器,其父加載器為擴展類加載器,上面那個。它從環境變量classpath中多指定的目錄中加載。它是用戶自定義類加載器的默認父加載器,該類是純java類是lava.lang.ClassLoader類的子類

**注意:使用Class.forName("com.test.Test1")進行類裝載時,會自動執行類中的靜態代碼塊,但不會執行構造方法

使用loadClass("com.test.Test1")進行裝載時,不會自動執行其中的靜態代碼塊,也不會執行構造方法

***:同一個類,由兩個不同的類加載器去加載,會被認為是兩個不相同的類,在方法區中會有兩份該類的類信息

只有使用啟動類加載器加載的類,比如:java.lang.Strong、java.lang.Object 等類,在方法區中只有一份類信息。

判斷兩個類是否相等的基礎是,這兩個類的類加載器是不是同一個

初始化:對于類的初始化階段,虛擬機規范規定了5種情況下必須立即對類進行初始化

1、遇到new、getstatic、putstatic、invokestatic這四條字節碼指令時,如果類之前沒有進行過初始化會進行初始化。這四條字節碼對應的是:new 實例、靜態字段取值、靜態字段賦值、靜態字段調用。

2、使用java.lang.refleat包的方法進行反射調用

3、當初始化一個類時,如果發現其父類還沒有被初始化,需要先初始化其父類

4、當虛擬機啟動,需要執行main方法的類

5、當使用LDK1.7的動態預言支持時,如果一個java.lang.invole.MethodHandle實例的最后解析結果是REF_getStatic,REF_putStatic,REF_invokeStatic的方法句柄。

以下幾種情況需要注意:

1、對于靜態字段,只有直接定義這個字段的類或者接口才會被初始化,如果是通過子類引用父類中的靜態字段,只會觸發父類的初始化。

2、常量在編譯階段會存入調用類的常量池中,本質上并沒有直接引用到定義類的常量,因此不會觸發定義常量的類的初始化。備注:只有編譯器能確定之的常量才會進行該操作,編譯器無法確定的常量值,還是會觸發目標類的初始化。

例如:public static final String uuid = UUID.randomUUID().toString(); 這行代碼,當其他類在引用uuid時,會觸發定義該uuid的類的初始化

3、通過數組定義來引用類,不會觸發類的初始化 例如: Super[ ] s = new Super[10]; 這行代碼并不會觸發Super類的初始化

4、當一個接口初始化的時候,并不要求其父接口也被初始化,只有真正使用到父接口的時候才會初始化。

私信我獲取更多JAVA學習資料!

————————————————

本文轉載至CSDN——終南山_半仙,如有侵權請聯系立刪!

原文鏈接:https://blog.csdn.net/qq_37150258/article/details/83505011

ae87d658a6a7c2f1425a0c2898afac36.png

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

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

相關文章

所有前端都要看的2D游戲化互動入門基礎知識

背景現在越來越多的公司和APP開始使用游戲化的方式去做產品了,所謂游戲化,是指在非游戲環境中將游戲的思維和游戲的機制進行整合運用,以引導用戶互動和使用的方法。支付寶里面的螞蟻莊園、螞蟻森林,通過游戲和公益的結合實現用戶的…

江蘇一動物園現“旋轉活馬” 園方:創意來自馬術訓練

中新網南通1月31日電 (記者唐娟)“旋轉馬設備采用同時容納六匹馬的遛馬器組裝而成,對馬匹沒有任何傷害,初衷是希望給小朋友一種全新體驗,這才有了這個創意項目。”1月31日,針對活馬版“旋轉木馬”引發的熱議,江蘇南通森…

Byte數組轉換成string 的方法積累

.net的加密算法,返回的都是byte[] 類型,在存貯起來讓人非常頭疼,最簡單的方法就是把byte[]轉換成string來存貯,當然如果數據量大的話,另當別論。 所以我就把byte[]轉換成string的方法做一個簡單的積累與分析。目前有3種…

加快信息化建設對地方發展的_加快設計師職業發展的9種方法

加快信息化建設對地方發展的重點 (Top highlight)Over the past few months, I have had an increase in conversations with design students from various institutions, as well as early, to senior-level designers, researchers, & product managers from various co…

Docker:Nginx-Redis-Mysql-PHP 部署

Docker:Nginx-Redis-Mysql-PHP 部署 網絡橋接 Docker容器之間默認網絡隔離,需要使用橋接網絡進行互通 創建網絡 docker network create net-local docker network ls NETWORK ID NAME DRIVER SCOPE da9c8fc3dc80 bridge bridge local 78641…

epoll監聽文件_介紹一下 Android Handler 中的 epoll 機制?

介紹一下 Android Handler 中的 epoll 機制?目錄:IO 多路復用select、poll、epoll 對比epoll APIepoll 使用示例Handler 中的 epoll 源碼分析IO 多路復用IO 多路復用是一種同步 IO 模型,實現一個線程可以監視多個文件句柄。一旦某個文件句柄就…

前端工程師的一大神器——puppeteer

大家好,我是若川。歡迎加我微信 ruochuan12,長期交流學習。今天推薦神器puppeteer,我猜有挺多人不知道。文章不長,看完有空也可以試玩。我18年也寫過一篇puppeteer爬取生成pdf的文章,時間真快。前端使用puppeteer 爬蟲…

selenium界面元素定位

一、 Selenium界面元素定位 本文元素定位以das2為例 #導入包 from selenium import webdriver #打開火狐驅動 driverwebdriver.Firefox() #訪問網址 driver.get("http://192.168.3.217:8080/das/seatlogin.jsp ") 進行web頁面自動化測試,對頁面上…

vue.js ui_UI / UX開發:考慮Vue.js

vue.js uiBecause sometimes we have to add logic to our concepts, and Vue makes it a whole lot easier.因為有時我們必須在概念中添加邏輯,而Vue使其變得更加容易。 FULL DISCLOSURE: THIS IS NOT A COMPLETE JAVASCRIPT OR VUE COURSE. There’s no way I co…

Silverlight學習筆記十七BingMap(三)之地圖的地區標識

如果我們需要在Bing Maps中加入一個小圖釘標記&#xff0c;該如何實現了&#xff1f; Bing Maps控件已經為我們提供了這個功能&#xff0c;在Microsoft.Maps.MapControl名稱空間下提供了實現圖釘應用的圖釘層Pushpin類用該類來實現普通標識 在Xaml中添加<map:Pushpin Locati…

win10查看pcie設備_壹拓網科技解密WIN10系統使用向日葵開機棒遠程開機需要設置幾個地方...

向日葵開機棒&#xff0c;是一款非常好用的遠程智能遠程開機硬件&#xff0c;它一頭接網線&#xff0c;另外一頭和被開電腦接在同一個路由器下&#xff0c;不需要和被開電腦或者設備直接連接&#xff0c;當然&#xff0c;被開電腦需要有線聯網&#xff0c;暫時不支持使用無線方…

如何成為公司獨當一面的工程師

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天推薦黃老師的這篇文章&#xff0c;你可能看到過了&#xff0c;但值得再看一遍。之前常有小伙伴問&#xff0c;大多情況下我都會分享這篇文章。點擊下方卡片關注我、加個星標&#xff0c;或者…

webpack4.0配置記錄(2)

接上一篇webpack4.0配置記錄(1),繼續記錄學習webpack配置。 定義環境變量 new Webpack.DefinePlugin({//用來定義全局環境變量DEV:JSON.stringify(dev),FLAG:true }), webpack簡單優化 noParsemodule:{noParse:/jquery/,//不去解析設置的包所依賴的關系,如jquery } ignorePlugi…

flex如何做響應式設計_響應式設計-您做錯了!

flex如何做響應式設計Responsive design is not just about the web that automatically adjusts to different screen resolutions and resizeable images, but designs that are crucial for web performance.自適應設計不僅涉及可自動適應不同屏幕分辨率和可調整大小圖像的網…

怎么查看和獲取SQL Server實例名

查看實例名時可用 1、服務—SQL Server(實例名)&#xff0c;默認實例為(MSSQLSERVER) 或在連接企業管理時-查看本地實例 2、通過注冊表 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/InstalledInstance 3、用命令 sqlcmd/osql sqlcmd -L sqlcmd -Lc osql -L 獲…

30萬手表推薦_今年六十歲生日,兒子說要送只30萬的手表,請問有哪些推薦?...

關注腕表部落&#xff0c;盡享腕表生活一位讀者向筆者提出這樣一個問題&#xff1a;今年六十歲生日&#xff0c;兒子說要送只30萬的手表&#xff0c;請問有哪些推薦&#xff1f;首先要恭喜這位老爺子&#xff0c;一來是生日馬上就要到了&#xff0c;二來是還有這么孝順而且慷慨…

關注博客

https://blog.51cto.com/oldboyhttps://blog.51cto.com/yw666轉載于:https://blog.51cto.com/11732716/2348556

寫 Node.js 代碼,從學會調試開始

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天推薦這篇調試文章&#xff0c;熟悉我的讀者都知道我寫的源碼文章都多次強調要調試&#xff0c;而且寫了調試方法。點擊下方卡片關注我、加個星標&#xff0c;或者查…

創建用戶友好的表單

Forms are a common way to engage with users and could be a user’s first impression of your product. Since forms aren’t always the user’s favourite thing, it is essential to make filling out forms as easy as possible. Let’s go over a few tips for creati…

細節決定成敗—關于.net的.dll.refresh文件

一直在做.net的項目&#xff0c;c/s的、b/s的&#xff0c;一直沒有注意這個東西。眾所周知&#xff0c;.net的程序生成后會在bin目錄下生成.dll文件&#xff0c;而.dll.refresh這個文件從何而來呢&#xff1f;那天無聊地google了下才知&#xff0c;這個東東是在你的項目中引用第…