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