国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

阿里高頻面試題,熱部署了解嗎?

開發(fā) 前端
驗(yàn)證是連接階段的第一步,這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全。

[[415464]]

本文轉(zhuǎn)載自微信公眾號「稀飯下雪」,作者帥氣的小飯飯。轉(zhuǎn)載本文請聯(lián)系稀飯下雪公眾號。

熟悉雙親委派模型嗎?

熟悉,這題我會。

機(jī)會來了,我八股文大神可是專門修煉過這個(gè)的。

我們?yōu)樯恫荒茉贘ava工程中定義同名的String的Java文件?

(⊙o⊙)…

這.....

多線程加載類的時(shí)候?yàn)槭裁礇]有線程問題?

臥槽 ....

首先,在講解這道題之前,先來劃重點(diǎn)

類加載時(shí)機(jī)與過程

類從被加載到虛擬機(jī)內(nèi)存中開始,到卸載出內(nèi)存為止,它的整個(gè)生命周期包括:加載(Loading)、驗(yàn)證(Verification)、準(zhǔn)備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個(gè)階段。其中準(zhǔn)備、驗(yàn)證、解析3個(gè)部分統(tǒng)稱為連接(Linking)

加載、驗(yàn)證、準(zhǔn)備、初始化和卸載這5個(gè)階段的順序是確定的,類的加載過程必須按照這種順序按部就班地開始,而解析階段則不一定:它在某些情況下可以在初始化階段之后再開始,這是為了支持Java語言的運(yùn)行時(shí)綁定(也稱為動態(tài)綁定或晚期綁定)

加載

在加載階段(可以參考java.lang.ClassLoader的loadClass()方法),虛擬機(jī)需要完成以下3件事情:

  1. 通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流(并沒有指明要從一個(gè)Class文件中獲取,可以從其他渠道,譬如:網(wǎng)絡(luò)、動態(tài)生成、數(shù)據(jù)庫等);
  2. 將這個(gè)字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu);
  3. 在內(nèi)存中生成一個(gè)代表這個(gè)類的java.lang.Class對象,作為方法區(qū)這個(gè)類的各種數(shù)據(jù)的訪問入口;

驗(yàn)證

驗(yàn)證是連接階段的第一步,這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全。驗(yàn)證階段大致會完成4個(gè)階段的檢驗(yàn)動作:

  1. 文件格式驗(yàn)證;
  2. 元數(shù)據(jù)驗(yàn)證;
  3. 字節(jié)碼驗(yàn)證;
  4. 符號引用驗(yàn)證;

準(zhǔn)備

準(zhǔn)備階段是正式為類變量分配內(nèi)存并設(shè)置類變量初始值的階段,這些變量所使用的內(nèi)存都將在方法區(qū)中進(jìn)行分配。這時(shí)候進(jìn)行內(nèi)存分配的僅包括類變量(被static修飾的變量),而不包括實(shí)例變量,實(shí)例變量將會在對象實(shí)例化時(shí)隨著對象一起分配在堆中。其次,這里所說的初始值「通常情況」下是數(shù)據(jù)類型的零值,

例如:public static int a = 1

這個(gè)時(shí)候變量a在準(zhǔn)備階段過后的初始值為0,而不是1,因?yàn)檫@個(gè)時(shí)候尚未開始執(zhí)行任何java方法,而把a(bǔ)賦值為1的指令是程序被編譯后,存放于類構(gòu)造器()方法中,所以把a(bǔ)賦值為1的動作將在初始化階段才執(zhí)行。

而當(dāng):public static final int a = 2

這種情況又不同了,當(dāng)類字段的屬性是ConstantValue時(shí),會在準(zhǔn)備階段初始化為指定的值,所以標(biāo)志位final之后,a的值再準(zhǔn)備階段便被初始化為2,而不再是1 了。

劃重點(diǎn):這里其實(shí)也好理解,final標(biāo)志的常量意味著是不變的,那么在準(zhǔn)備階段直接賦值了就可以了,沒必要多此一舉,先賦初始值,再在初始化的時(shí)候額外再做一次。

解析

解析階段是虛擬機(jī)將常量池內(nèi)的符號引用替換為直接引用的過程。解析動作主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調(diào)用點(diǎn)限定符7類符號引用進(jìn)行。

初始化

在介紹初始化時(shí),要先介紹兩個(gè)方法::

在編譯生成class文件時(shí),會自動產(chǎn)生兩個(gè)方法,一個(gè)是類的初始化方法, 另一個(gè)是實(shí)例的初始化方法

<clinit>:在jvm第一次加載class文件時(shí)調(diào)用,包括靜態(tài)變量初始化語句和靜態(tài)塊的執(zhí)行

<init>: 在實(shí)例創(chuàng)建出來的時(shí)候調(diào)用,包括調(diào)用new操作符;調(diào)用 Class 或 Java.lang.reflect.Constructor 對象的newInstance()方法;調(diào)用任何現(xiàn)有對象的clone()方法;通過 java.io.ObjectInputStream 類的getObject() 方法反序列化。

類初始化階段是類加載過程的最后一步,到了初始化階段,才真正開始執(zhí)行類中定義的java程序代碼。在準(zhǔn)備階段、變量已經(jīng)被賦值過一次系統(tǒng)要求的初始值,而在初始化階段,則根據(jù)開發(fā)人員通過程序去初始化類變量和其他資源,或者說:初始化階段是執(zhí)行類構(gòu)造器()方法的過程.

()方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)語句塊 static{} 中的語句合并產(chǎn)生的,編譯器收集的順序是由語句在源文件中出現(xiàn)的順序所決定的,靜態(tài)語句塊只能訪問到定義在靜態(tài)語句塊之前的變量,定義在它之后的變量,在前面的靜態(tài)語句塊可以賦值,但是不能訪問。

「總結(jié)一大波美女:其實(shí)也這個(gè)過程不用記,靠理解最好了,你想想看哦,你要把一個(gè)類加載到虛擬機(jī),是不是要有一個(gè)加載的過程,這個(gè)過程就是將你的class對應(yīng)的二進(jìn)制字節(jié)流加載到虛擬機(jī)中,加載完虛擬機(jī)是不是要校驗(yàn)下,規(guī)則的你給的東西有沒有毒?驗(yàn)證完了,是不是要幫我們把一些類變量設(shè)置下初始值?設(shè)置完了還有一些對象標(biāo)志啊什么的,是不是也要幫忙解析成直接引用,最后是不是還要走下我們類的初始化方法。」

雙親委派模型

所謂雙親委派是指每次收到類加載請求時(shí),先將請求委派給父類加載器完成(所有加載請求最終會委派到頂層的Bootstrap ClassLoader加載器中),如果父類加載器無法完成這個(gè)加載(該加載器的「搜索范圍」中沒有找到對應(yīng)的類),子類嘗試自己加載, 如果都沒加載到,則會拋出 ClassNotFoundException 異常, 看到這里其實(shí)就解釋了文章開頭提出的第一個(gè)問題,父加載器已經(jīng)加載了JDK 中的 String.class 文件,所以我們不能定義同名的 String java 文件。

這么做的好處是什么?

因?yàn)檫@樣可以避免重復(fù)加載,當(dāng)父親已經(jīng)加載了該類的時(shí)候,就沒有必要 ClassLoader 再加載一次。考慮到安全因素,我們試想一下,如果不使用這種委托模式,那我們就可以隨時(shí)使用自定義的String來動態(tài)替代java核心api中定義的類型,這樣會存在非常大的安全隱患,而雙親委托的方式,就可以避免這種情況,因?yàn)镾tring 已經(jīng)在啟動時(shí)就被引導(dǎo)類加載器(Bootstrcp ClassLoader)加載,所以用戶自定義的ClassLoader永遠(yuǎn)也無法加載一個(gè)自己寫的String,除非你改變 JDK 中 ClassLoader 搜索類的默認(rèn)算法。

我們發(fā)現(xiàn)除了啟動類加載器(BootStrap ClassLoader),每個(gè)類都有其"父類"加載器,這種組合關(guān)系是通過組合模式來決定的,而不是繼承關(guān)系。

三種類加載器分別職責(zé)是啥?

  1. 「Bootstrap ClassLoader」:這個(gè)加載器不是一個(gè)Java類,而是由底層的c++實(shí)現(xiàn),負(fù)責(zé)在虛擬機(jī)啟動時(shí)加載Jdk核心類庫(如:rt.jar、resources.jar、charsets.jar等)以及加載后兩個(gè)類加載器。這個(gè)ClassLoader完全是JVM自己控制的,需要加載哪個(gè)類,怎么加載都是由JVM自己控制,別人也訪問不到這個(gè)類
  2. 「Extension ClassLoader」:是一個(gè)普通的Java類,繼承自ClassLoader類,負(fù)責(zé)加載{JAVA_HOME}/jre/lib/ext/目錄下的所有jar包。
  3. 「App ClassLoader」:是Extension ClassLoader的子對象,負(fù)責(zé)加載應(yīng)用程序classpath目錄下的所有jar和class文件。

通常用這兩種方式來動態(tài)加載一個(gè) java 類,「Class.forName()」 與 「ClassLoader.loadClass()」 ,但是兩個(gè)方法之間也是有一些細(xì)微的差別,具體看上一篇文章:Object詳談

雙親委派模型源碼解析

來看看核心loadClass的方法

可以看到方法有同步塊(synchronized), 這樣就算多線程情況也不會出現(xiàn)重復(fù)加載的情況。

JAVA熱部署實(shí)現(xiàn)

什么是熱部署(hotswap)?

Java 類是通過 Java 虛擬機(jī)加載的,某個(gè)類的 class 文件在被 classloader 加載后,會生成對應(yīng)的 Class 對象,之后就可以創(chuàng)建該類的實(shí)例,而熱部署是在不重啟 Java 虛擬機(jī)的這一前提下,自動偵測到 class 文件的變化,更新運(yùn)行時(shí) class 的行為。

而實(shí)際上,對于同一個(gè)全限定名的java類,只能被加載一次,而且無法被卸載。

那么竟然類無法被卸載,那么能不能把她媽給換了?也就是類加載器,答案是可以的,我們可以自定義類的加載器,并重寫ClassLoader的findClass方法,然后熱部署步驟就是:

  1. 銷毀自定義ClassLoader(被該加載器加載的class也會自動卸載);
  2. 更新class
  3. 使用新的ClassLoader去加載class

最終落地到實(shí)現(xiàn),其實(shí)就是將ClassLoader給覆蓋掉,怎么覆蓋,重新new一個(gè)同樣的ClassLoader就可以了。

「總結(jié)一大波:我們雖然不能對被加載的class動手動腳,但是卻可以對ClassLoader動手腳,搞掉它,然后使用新的ClassLoader加載class就可以了。」

那么什么時(shí)候回收掉老的類呢?畢竟替換了,就存在新舊問題了,也就存在內(nèi)存泄露問題了。

通常情況下,在JSP,OSGI及其他一些支持熱替換的庫,都是需要進(jìn)行類的卸載回收的,否則類在替換后,老的類就沒用了但是還在內(nèi)存中,就會造成內(nèi)存泄漏。

類的卸載需要滿足以下三個(gè)條件:

  • 該類所有的實(shí)例都已經(jīng)被GC,也就是JVM中不存在該Class的任何實(shí)例。
  • 加載該類的ClassLoader已經(jīng)被GC。
  • 該類的java.lang.Class 對象沒有在任何地方被引用,如不能在任何地方通過反射訪問該類的方法。

所以在自定義類加載器時(shí),就要注意這一點(diǎn),如果你是希望其使用完成后就被卸載,那么就需要特別留意類加載器及類的作用域了。

原文鏈接:https://mp.weixin.qq.com/s/JT4Vh_tXzNAQdLSAosy2cQ

 

責(zé)任編輯:武曉燕 來源: 稀飯下雪
相關(guān)推薦

2021-02-23 12:43:39

Redis面試題緩存

2019-11-26 10:30:11

CSS前端面試題

2021-01-22 11:58:30

MySQL數(shù)據(jù)庫開發(fā)

2019-12-26 09:52:33

Redis集群線程

2021-11-02 10:10:38

面試元素語言

2015-07-13 09:45:32

阿里校招

2020-08-31 12:20:07

Python面試題代碼

2022-08-22 18:57:29

React前端面試

2021-12-08 11:18:21

Spring Bean面試題生命周期

2022-04-15 09:23:29

Kubernetes面試題

2020-03-03 17:47:07

UDP TCP面試題

2018-01-02 09:23:38

數(shù)據(jù)分析算法阿里巴巴

2020-06-04 14:40:40

面試題Vue前端

2018-12-03 09:42:32

Java程序員阿里面試

2011-03-24 13:27:37

SQL

2023-11-13 07:37:36

JS面試題線程

2025-07-21 06:23:45

MySQL數(shù)據(jù)庫容器

2025-08-19 09:28:53

2021-02-26 05:22:50

CPU接口網(wǎng)絡(luò)包

2023-10-20 15:58:27

Python刪除指定字符
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

色老头一区二区三区在线观看| 久久se这里有精品| 日韩欧美一区二区三区久久| 国产午夜精品全部视频播放| 欧美精品videosex牲欧美| 最新av中文字幕| 五月精品视频| 欧美另类在线播放| 日本亚洲免费观看| 亚洲欧洲国产日韩| 欧美成人女星排行榜| 国产一级特黄a大片免费| 国产无遮挡在线视频免费观看| 最新日韩欧美| 欧美国产日韩免费| 金瓶狂野欧美性猛交xxxx| 国产精品99一区二区三区| 欧美成人激情视频| 98色花堂精品视频在线观看| 色婷婷综合久久| 欧美12一14sex性hd| 激情综合中文娱乐网| 欧美人与性动交| 欧美特黄aaaaaaaa大片| 亚洲成人1234| 看黄在线观看| 91精品国产综合久久久久久久久久| 在线国产一级| 一区二区日韩| 99精品久久只有精品| а√天堂8资源在线| 99re视频在线观看| 欧美理伦片在线播放| 久久99精品久久久久久噜噜| 亚洲永久av| 亚洲另类xxxx| 日日夜夜亚洲| 91tv亚洲精品香蕉国产一区7ujn| 88久久精品| 国产精品国内视频| 黄色成人精品网站| 日韩经典在线视频| 六月婷婷激情综合| 91精品国产吴梦梦| 男女啪啪999亚洲精品| 亚洲欧洲成人av每日更新| 人人干人人干人人| 久久精品久久久| 夜夜精品浪潮av一区二区三区| 亚洲精品永久免费| 欧美天堂在线| 国产成人亚洲综合| 久久精品亚洲一区二区| 亚洲日本japanese丝袜| 99亚洲伊人久久精品影院红桃| 欧美一级黄色网| 91丨九色丨蝌蚪富婆spa| 国产精品成人免费电影| 欧洲grand老妇人| 蜜桃日韩视频| 国产精品夜夜爽| 视频一区亚洲| 亚洲自拍与偷拍| 影音先锋男人资源在线| 久久天堂电影网| 久久久久se| 丁香网亚洲国际| av激情久久| 精品一区二区国语对白| wwwww在线观看免费视频| 久久久久久久性| 91大神网址| 亚洲电影一级片| 六月婷婷激情综合| 欧美麻豆精品久久久久久| 美女扒开大腿让男人桶| 国产精品久久777777| 国产尤物视频在线| 精品国精品国产尤物美女| 制服黑丝国产在线| 欧美成人一二三| 极品少妇一区二区三区| 国产在线制服美女| 欧美影院一区二区| 电影一区二区在线观看| 国产日韩在线一区二区三区| 蜜臀av一级做a爰片久久| 97自拍视频| 亚洲一区在线观看视频| 亚洲欧美一区二区三区在线播放| 精品免费在线观看| 欧美www视频在线观看| 国产精品久久国产| 中文字幕一区二区精品| 粉嫩久久99精品久久久久久夜| 欲香欲色天天天综合和网| 无码粉嫩虎白一线天在线观看| 导航福利在线| 国产精品久久久久影院| 性xxxxfreexxxxx欧美丶| 欧美中文在线视频| 国内自拍欧美| 国产乱xxⅹxx国语对白| 欧美资源在线观看| 91精品国产综合久久香蕉麻豆| 久久久777| 日本一道高清一区二区三区| 在线观看麻豆| 日本一区二区三区四区 | 国产精品久久久久久中文字| 亚洲黄色免费网站| 超碰caoporn久久| 精品人妻一区二区三区四区在线| 午夜视频在线观看一区二区| 一区二区三区福利| 国产一区二区三区不卡av| 成人高清免费在线| 日本熟妇人妻中出| 国产欧美综合精品一区二区| 一本色道久久综合狠狠躁篇怎么玩 | 免费高潮视频95在线观看网站| 亚洲.欧美.日本.国产综合在线| 在线一区二区视频| 久久精品首页| 亚洲成a人片77777在线播放| 国产免费福利| 你懂的视频在线一区二区| 午夜精品一区二区三区在线播放 | 久久激情一区| 不卡av影片| 国外av在线| 亚洲 自拍 另类小说综合图区| 欧美黑人一级爽快片淫片高清| 午夜精品久久久久久久久久久 | 欧美日韩另类国产亚洲欧美一级| 欧美女优在线| 国产精品91久久| 日韩中文娱乐网| 综合天堂av久久久久久久| 黄色www在线观看| 久久国产日韩欧美| 国产精品无av码在线观看| 成人美女视频在线观看18| 国产成人精品一区二区免费看京| 亚洲男男gay视频| 日日噜噜夜夜狠狠视频| 成人av在线播放观看| 免费在线精品视频| 少妇高潮喷水在线观看| 2021狠狠干| 中文字幕在线成人| 日韩无一区二区| 欧美亚洲图片小说| 又紧又大又爽精品一区二区| 国产精品国产a级| 国产人妖乱国产精品人妖| 一本色道88久久加勒比精品| 成人直播在线观看| 色先锋久久影院av| 成人3d精品动漫精品一二三| 女人裸体免费网站| 久草在线资源网站| 成人性生交大片免费看视频r| 精品免费国产一区二区| 高清国产一区| 亚洲日本理论电影| 欧美视频第三页| 黄色福利视频网站| 免费看美女视频在线网站| 中文字幕在线直播| 欧美激情极品| 香蕉视频国产精品| 日韩和的一区二区| 成人av在线网| 欧美影视一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 国产欧美日韩亚州综合 | 午夜老司机精品| 中文字幕日韩一区二区三区| 成视频免费在线看| 少妇一级淫免费播放| 国产精品久久久久久久久久| 欧美一级淫片aaaaaaa视频| 97在线观看免费| 粉嫩av一区二区三区免费观看| 奇米4444一区二区三区| 欧美另类videosbestsex日本| 网址你懂得在线观看| 免费在线观看一级毛片| 偷拍精品福利视频导航| 在线电影一区二区| 亚洲国产精品av| 色国产综合视频| 欧美极品少妇xxxxⅹ喷水| 日韩免费一区二区三区| 伊大人久久香线焦宗合一75大| 欧洲精品一区二区三区| а√天堂8资源在线官网| 成人无号精品一区二区三区| 99精品热视频|