日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 深入Java虛擬機JVM類加載初始化學習筆記

深入Java虛擬機JVM類加載初始化學習筆記

來源:程序員人生   發布時間:2016-09-06 15:12:56 閱讀次數:2874次

1. Classloader的作用,概括來講就是將編譯后的class裝載、加載到機器內存中,為了以后的程序的履行提供條件條件。

2. 1段程序引發的思考:

風中葉老師在他的視頻中給了我們1段程序,號稱是世界上所有的Java程序員都會犯的毛病。

1般不假思索的結論就是,a=1,b=1。給出的緣由是:a、b都是靜態變量,在構造函數調用的時候已對a和b都加1了。答案就都是1。但是運行完后答案卻是a=1,b=0。

為何呢,這3句不過就是靜態變量的聲明、初始化,值的變化和聲明的順序還有關系嗎?Java不是面向對象的嗎?怎樣和結構化的語言似地,順序還有關系。這個就是和Java虛擬機JVM加載類的原理有著直接的關系。

3. 類在JVM中的工作原理

要想使用1個Java類為自己工作,必須經過以下幾個進程

1):類加載load:從字節碼2進制文件——.class文件將類加載到內存,從而到達類的從硬盤上到內存上的1個遷移,所有的程序必須加載到內存才能工作。將內存中的class放到運行時數據區的方法區內,以后在堆區建立1個java.lang.Class對象,用來封裝方法區的數據結構。這個時候就體現出了萬事萬物皆對象了,干甚么事情都得有個對象。就是到了最底層究竟是雞生蛋,還是蛋生雞呢?類加載的終究產物就是堆中的1個java.lang.Class對象。

2):連接:連接又分為以下小步驟

驗證:出于安全性的斟酌,驗證內存中的字節碼是不是符合JVM的規范,類的結構規范、語義檢查、字節碼操作是不是合法、這個是為了避免用戶自己建立1個非法的XX.class文件就進行工作了,或是JVM版本沖突的問題,比如在JDK6下面編譯通過的class(其中包括注解特性的類),是不能在JDK1.4的JVM下運行的。

準備:將類的靜態變量進行分配內存空間、初始化默許值。(對象還沒生成呢,所以這個時候沒有實例變量甚么事情)

解析:把類的符號援用轉為直接援用(保存)

3):類的初始化: 將類的靜態變量賦予正確的初始值,這個初始值是開發者自己定義時賦予的初始值,而不是默許值。

4. 類的主動使用與被動使用

以下是視為主動使用1個類,其他情況均視為被動使用!

1):初學者最為經常使用的new1個類的實例對象(聲明不叫主動使用)

2):對類的靜態變量進行讀取、賦值操作的。

3):直接調用類的靜態方法。

4):反射調用1個類的方法。

5):初始化1個類的子類的時候,父類也相當于被程序主動調用了(如果調用子類的靜態變量是從父類繼承過來并沒有復寫的,那末也就相當于只用到了父類的東東,和子類無關,所以這個時候子類不需要進行類初始化)。

6):直接運行1個main函數入口的類。

所有的JVM實現(不同的廠商有不同的實現,有人就說IBM的實現比Sun的要好……)在首次主動調用類和接口的時候才會初始化他們。

5. 類的加載方式

1):本地編譯好的class中直接加載

2):網絡加載:java.net.URLClassLoader可以加載url指定的類

3):從jar、zip等等緊縮文件加載類,自動解析jar文件找到class文件去加載util類

4):從java源代碼文件動態編譯成為class文件

6. 類加載器

JVM自帶的默許加載器

1):根類加載器:bootstrap,由C++編寫,所有Java程序沒法取得。

2):擴大類加載器:由Java編寫。

3):系統類、利用類加載器:由Java編寫。

用戶自定義的類加載器:java.lang.ClassLoader的子類,用戶可以定制類的加載方式。每個類都包括了加載他的ClassLoader的1個援用——getClass().getClassLoader()。如果返回的是null,證明加載他的ClassLoader是根加載器bootstrap。

java.lang.Stringsun.misc.Launcher$AppClassLoader@19821f

,統類、利用類加載器)去加載的。像jre的rt.jar下面的java.lang.*都是默許的根類加載器去加載這些運行時的類。

7. 解釋類連接階段的準備

節的空間,并且為其賦予默許值0,而像b = 10這段代碼在此階段是不起作用的,b仍

然是默許值0。

8.這里面的指針就是

C++的指針

9. 回顧那個詭異的代碼

是根據內部類的靜態方法要1個Singleton實例。

這個時候就屬于主動調用Singleton類了。

以后內存開始加載Singleton類

1):對Singleton的所有的靜態變量分配空間,賦默許的值,所以在這個時候,singleton=null、a=0、b=0。注意b的0是默許值,其實不是我們手工為其賦予的的那個0值。

2):以后對靜態變量賦值,這個時候的賦值就是我們在程序內行工初始化的那個值了。此時singleton = new Singleton();調用了構造方法。構造方法里面a=1、b=1。以后接著順序往下履行。

a沒有賦值,保持原狀a=1。b被賦值了,b本來的1值被覆蓋了,b=0。所以結果就是這么來的。類中的靜態塊static塊也是順序地從上到下履行的。

10. 編譯經常量、非編譯經常量的靜態變量

也就是說編譯器很智能的、在編譯的時候自己就可以算出4+4是8

,是1個固定的數字。沒有甚么未知的因素在里面。

這個時候靜態塊就履行了,證明類初始化了。在靜態final變量在編譯時不定的情況下。如果客戶程序這個時候訪問了該類的靜態變量,那就會對類進行初始化,所以盡可能靜態final變量盡可能沒甚么可變因素在里面1,否則性能會有所降落。

11. ClassLoader的剖析

ClassLoader的loadClass方法加載1個類不屬于主動調用,不會致使類的初始化。以下代碼塊

其實不會讓類加載器初始化test01.ClassDemo,由于這不屬于主動調用此類。

ClassLoader的關系:

根加載器——》擴大類加載器——》利用類加載器——》用戶自定義類加載器

加載類的進程是首先從根加載器開始加載、根加載器加載不了的,由擴大類加載器加載,再加載不了的有利用加載器加載,利用加載器如果還加載不了就由自定義的加載器(1定繼承自java.lang. ClassLoader)加載、如果自定義的加載器還加載不了。而且下面已沒有再特殊的類加載器了,就會拋出ClassNotFoundException,表面上異常是類找不到,實際上是class加載失敗,更不能創建該類的Class對象。

若1個類能在某1層類加載器成功加載,那末這1層的加載器稱為定義類加載器。那末在這層類生成的Class援用返回下1層加載器叫做初始類加載器。由于加載成功后返回1個Class援用給它的服務對象——也就是調用它的類加載器。斟酌到安全,父拜托加載機制。

5 / 7

它里面調用了很多native的方法,也就是通過JNI調用底層C++的代碼。

12. 當1個類被加載、連接、初始化后,它的生命周期就開始了,當代表該類的Class對象

不再被援用、即已不可觸及的時候,Class對象的生命周期結束。那末該類的方法區內的數據也會被卸載,從而結束該類的生命周期。1個類的生命周期取決于它Class對象的生命周期。由Java虛擬機自帶的默許加載器(根加載器、擴大加載器、系統加載器)所加載的類在JVM生命周期中始終不被卸載。所以這些類的Class對象(我稱其為實例的模板對象)始終能被觸及!而由用戶自定義的類加載器所加載的類會被卸載掉!

7 / 7

學習有困難可以加扣:578024144進行交換得到幫助還可以關注微信公眾號:javaniuniu獲得免費得聽課權限



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久国产精品久久久久久久久久 | 日本一区二区免费看 | 超碰97国产精品人人cao | 成人性视频免费网站 | 99re66热这里只有精品8 | 亚洲性无码av在线 | 黄色av免费在线观看 | 人人射 | 日韩视频免费在线 | 久久av在线播放 | a视频在线 | 国产在线精品一区二区 | 亚洲自拍偷拍视频 | 99久久精品免费看国产免费软件 | 久久久久久国产免费 | 在线成人www免费观看视频 | 亚洲精品久久久久久久久久久 | 亚洲精品视频自拍 | 亚洲一区二区三区在线视频观看 | 91欧美在线视频 | 成人国产精品久久久按摩 | 精品一区在线播放 | 一区二区三区在线播放 | 日韩欧美精品一区二区 | 日韩一区二区三区精品 | 经典久久| 一区在线观看 | 国产乱色国产精品播放视频 | aⅴ色国产 欧美 | 亚洲成人精品一区二区 | 亚洲激情视频在线播放 | 午夜专区| 免费91麻豆精品国产自产在线观看 | 中文字幕自拍偷拍 | www.久久精品 | 亚洲色图网址 | 91成人在线播放 | 天天草夜夜操 | 国产精品久久久久久久久免费软件 | 美女黄色在线观看 | 中文字幕av第一页 |