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