更新時(shí)間:2019-12-06 15:25:09 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2800次
一道類加載的問題,一個(gè)類,在類加載之后,如果對(duì)類的內(nèi)容進(jìn)行修改,如何在不重新啟動(dòng)虛擬機(jī)的情況下,加載已經(jīng)變化過的類
你可以創(chuàng)建個(gè)新的class loader,然后用loadClass加載,再newInstance;原來加載的classloader是不能重新加載的;這算是一個(gè)典型的容器思路。
《深入理解java虛擬機(jī)》
對(duì)java“書寫一次,到處運(yùn)行”(Write once, run anywhere)的理解?
一次編譯、到處運(yùn)行”說的是Java語言跨平臺(tái)的特性,Java的跨平臺(tái)特性與Java虛擬機(jī)的存在密不可分,可在不同的環(huán)境中運(yùn)行。比如說Windows平臺(tái)和Linux平臺(tái)都有相應(yīng)的JDK,安裝好JDK后也就有了Java語言的運(yùn)行環(huán)境。其實(shí)Java語言本身與其他的編程語言沒有特別大的差異,并不是說Java語言可以跨平臺(tái),而是在不同的平臺(tái)都有可以讓Java語言運(yùn)行的環(huán)境而已,所以才有了Java一次編譯,到處運(yùn)行這樣的效果。
嚴(yán)格的講,跨平臺(tái)的語言不止Java一種,但Java是較為成熟的一種。“一次編譯,到處運(yùn)行”這種效果跟編譯器有關(guān)。編程語言的處理需要編譯器和解釋器。Java虛擬機(jī)和DOS類似,相當(dāng)于一個(gè)供程序運(yùn)行的平臺(tái)。
程序從源代碼到運(yùn)行的三個(gè)階段:編碼——編譯——運(yùn)行——調(diào)試。Java在編譯階段則體現(xiàn)了跨平臺(tái)的特點(diǎn)。編譯過程大概是這樣的:首先是將Java源代碼轉(zhuǎn)化成.CLASS文件字節(jié)碼,這是第一次編譯。.class文件就是可以到處運(yùn)行的文件。然后Java字節(jié)碼會(huì)被轉(zhuǎn)化為目標(biāo)機(jī)器代碼,這是是由JVM來執(zhí)行的,即Java的第二次編譯。“到處運(yùn)行”的關(guān)鍵和前提就是JVM。
Java代碼的整個(gè)生命周期如圖:
談?wù)勀銓?duì) Java 平臺(tái)的理解?“Java 是解釋執(zhí)行”,這句話正確嗎?
Java 本身是一種面向?qū)ο蟮恼Z言,最顯著的特性有兩個(gè)方面,一是所謂的“書寫一次,到處運(yùn)行”(Write once, run anywhere),能夠非常容易地獲得跨平臺(tái)能力;另外就是垃圾收集(GC, Garbage Collection),Java 通過垃圾收集器(Garbage Collector)回收分配內(nèi)存,大部分情況下,程序員不需要自己操心內(nèi)存的分配和回收。
對(duì)于“Java 是解釋執(zhí)行”這句話,這個(gè)說法不太準(zhǔn)確。我們開發(fā)的 Java 的源代碼,首先通過 Javac 編譯成為字節(jié)碼(bytecode),然后,在運(yùn)行時(shí),通過 Java 虛擬機(jī)(JVM)內(nèi)嵌的解釋器將字節(jié)碼轉(zhuǎn)換成為最終的機(jī)器碼。但是常見的 JVM,比如我們大多數(shù)情況使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)編譯器,也就是通常所說的動(dòng)態(tài)編譯器,JIT 能夠在運(yùn)行時(shí)將熱點(diǎn)代碼編譯成機(jī)器碼,這種情況下部分熱點(diǎn)代碼就屬于編譯執(zhí)行,而不是解釋執(zhí)行了。
請(qǐng)對(duì)比 Exception 和 Error,另外,運(yùn)行時(shí)異常與一般異常有什么區(qū)別?
Exception 和 Error 都是繼承了 Throwable 類,在 Java 中只有 Throwable 類型的實(shí)例才可以被拋出(throw)或者捕獲(catch),它是異常處理機(jī)制的基本組成類型。
Exception 和 Error 體現(xiàn)了 Java 平臺(tái)設(shè)計(jì)者對(duì)不同異常情況的分類。Exception 是程序正常運(yùn)行中,可以預(yù)料的意外情況,可能并且應(yīng)該被捕獲,進(jìn)行相應(yīng)處理。
Error 是指在正常情況下,不大可能出現(xiàn)的情況,絕大部分的 Error 都會(huì)導(dǎo)致程序(比如 JVM 自身)處于非正常的、不可恢復(fù)狀態(tài)。既然是非正常情況,所以不便于也不需要捕獲,常見的比如 OutOfMemoryError 之類,都是 Error 的子類。
Exception 又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常在源代碼里必須顯式地進(jìn)行捕獲處理,這是編譯期檢查的一部分。
下面的代碼反映了異常處理中哪些不當(dāng)之處?
第一,盡量不要捕獲類似 Exception 這樣的通用異常,而是應(yīng)該捕獲特定異常,在這里是 Thread.sleep() 拋出的 InterruptedException。
第二,不要生吞(swallow)異常。
從性能角度來審視一下 Java 的異常處理機(jī)制,這里有兩個(gè)可能會(huì)相對(duì)昂貴的地方:
①、try-catch 代碼段會(huì)產(chǎn)生額外的性能開銷,或者換個(gè)角度說,它往往會(huì)影響 JVM 對(duì)代碼進(jìn)行優(yōu)化,所以建議僅捕獲有必要的代碼段,盡量不要一個(gè)大的 try 包住整段的代碼;
②、Java 每實(shí)例化一個(gè) Exception,都會(huì)對(duì)當(dāng)時(shí)的棧進(jìn)行快照,這是一個(gè)相對(duì)比較重的操作。如果發(fā)生的非常頻繁,這個(gè)開銷可就不能被忽略了。
ClassNotFoundException的產(chǎn)生原因?
Java支持使用Class.forName方法來動(dòng)態(tài)地加載類,任意一個(gè)類的類名如果被作為參數(shù)傳遞給這個(gè)方法都將導(dǎo)致該類被加載到JVM內(nèi)存中,如果這個(gè)類在類路徑中沒有被找到,那么此時(shí)就會(huì)在運(yùn)行時(shí)拋出ClassNotFoundException異常。
談?wù)?final、finally、 finalize 有什么不同?
final 可以用來修飾類、方法、變量,分別有不同的意義,final 修飾的 class 代表不可以繼承擴(kuò)展,final 的變量是不可以修改的,而 final 的方法也是不可以重寫的(override)。
finally 則是 Java 保證重點(diǎn)代碼一定要被執(zhí)行的一種機(jī)制。我們可以使用 try-finally 或者 try-catch-finally 來進(jìn)行類似關(guān)閉 JDBC 連接、保證 unlock 鎖等動(dòng)作。
finalize 是基礎(chǔ)類 java.lang.Object 的一個(gè)方法,它的設(shè)計(jì)目的是保證對(duì)象在被垃圾收集前完成特定資源的回收。finalize 機(jī)制現(xiàn)在已經(jīng)不推薦使用,并且在 JDK 9 開始被標(biāo)記為 deprecated。
強(qiáng)引用、軟引用、弱引用、幻象引用有什么區(qū)別?具體使用場(chǎng)景是什么?
所謂強(qiáng)引用(“Strong” Reference),就是我們最常見的普通對(duì)象引用,只要還有強(qiáng)引用指向一個(gè)對(duì)象,就能表明對(duì)象還“活著”,垃圾收集器不會(huì)碰這種對(duì)象。對(duì)于一個(gè)普通的對(duì)象,如果沒有其他的引用關(guān)系,只要超過了引用的作用域或者顯式地將相應(yīng)(強(qiáng))引用賦值為 null,就是可以被垃圾收集的了,當(dāng)然具體回收時(shí)機(jī)還是要看垃圾收集策略。
軟引用(SoftReference),通過SoftReference類實(shí)現(xiàn)。是一種相對(duì)強(qiáng)引用弱化一些的引用,可以讓對(duì)象豁免一些垃圾收集,只有當(dāng) JVM 認(rèn)為內(nèi)存不足時(shí),才會(huì)去試圖回收軟引用指向的對(duì)象。JVM 會(huì)確保在拋出 OutOfMemoryError 之前,清理軟引用指向的對(duì)象。軟引用通常用來實(shí)現(xiàn)內(nèi)存敏感的緩存,如果還有空閑內(nèi)存,就可以暫時(shí)保留緩存,當(dāng)內(nèi)存不足時(shí)清理掉,這樣就保證了使用緩存的同時(shí),不會(huì)耗盡內(nèi)存。
弱引用(WeakReference)通過WeakReference類實(shí)現(xiàn)。。并不能使對(duì)象豁免垃圾收集,在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中,一旦發(fā)現(xiàn)了具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程,因此不一定會(huì)很快回收弱引用的對(duì)象。
虛引用也叫幻象引用,通過PhantomReference類來實(shí)現(xiàn)。無法通過虛引用訪問對(duì)象的任何屬性或函數(shù)。幻象引用僅僅是提供了一種確保對(duì)象被 finalize 以后,做某些事情的機(jī)制。如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時(shí)候都可能被垃圾回收器回收。虛引用必須和引用隊(duì)列 (ReferenceQueue)聯(lián)合使用。
以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java常見的相關(guān)基礎(chǔ)知識(shí)”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743