1. java程序的運行機制
1. java語言是編譯型還是解釋型?
編譯型語言指使用特定的編譯器,針對特定的平臺(操作系統)將源代碼一次性翻譯成可被該平臺硬件執行的機器碼(包括機器指令和操作數),并包裝成該平臺所能識別的可執行的程序.這個過程稱為編譯(Compile).編譯生成的可執行的程序可以脫離開發環境,在特定的平臺上運行.解釋型語言指使用專門的解釋器對源代碼逐行解釋成特定平臺的機器碼,并立即執行.解釋型語言相當于將編譯型語言中的編譯和解釋工作混合在一起同時進行.
解釋型語言每執行一次源代碼就需要重新編譯一次,因此執行效率比較低,但解釋型語言跨平臺確比較容易,只需要提供特定平臺的解釋器,該解釋器就會負責將源代碼解釋成特定平臺上的機器指令.而編譯型語言的運行效率較高,但移植比較麻煩.如果需要移植,則需要將源代碼復制到新的平臺上,針對該平臺進行修改并重新編譯.
java語言既是編譯型語言也是解釋型語言.
java語言在編譯的時候不是生成特定平臺相關的機器碼,而是生成與平臺無關的字節碼,只面向JVM(Java Virtual Machine).
這種字節碼必須由JVM解釋執行.
2. 關于JVM
JVM可以看做是一個抽象的計算機,和實際的計算機一樣,也具有指令集和存儲區域.它負責執行指令,還要負責管理數據,內存和寄存器.不同平臺上的JVM是不同的,但是它們都提供相同的編程接口.所以JVM是java語言可以跨平臺的關鍵部分,只要不同的平臺實現不同的JVM,編譯后的class文件就可以在該平臺上運行.
2. 關于Java的部分概念
1. JDK=Java SE Development Kit,java標準版開發包,包括java編譯器,運行時環境(JRE)以及常用的java類庫等
2. JRE=Java Runtime Environment.java運行時環境.包含JVM以外,還有其他類的加載器,字節碼校驗器以及大量的基礎類庫.
3. Java EE SDK . 包括JDK.學習java EE的軟件和開發包(Software Development Kit)
3. java的環境配置
1. 在windows下用戶變量和系統變量的區別?
系統變量對所有用戶有效,用戶變量只對當前用戶有效.對于當前用戶而言,兩者沒有區別,只是系統變量中的配置會優先于用戶變量中的配置.
2. classPath需要配置嗎?
JDK1.4以前的版本需要手動的設置classPath變量,讓JRE去搜索java類文件.需要配置當前路徑(.)及%JAVA_HOME%\lib\dt.jar和%JAVA_HOME%\lib\tools.jar.但在JDK1.5中可以不配置classPath變量,JRE可以自動搜索當前路徑下的類文件和自動加載dt.jar和tools.jar,同時如果配置了classPath變量,則JRE會嚴格按照變量的路徑去搜索類文件.也就是說如果要配置classPath路徑就一定要配置準確,否則還是要報錯的.
3. classPath變量中的路徑盡量不要出現空格,否則可以引發錯誤
4. java的垃圾回收機制(Garbage Collection GC)
1. java語言不需要程序員直接控制內存回收.垃圾回收的發生有不可預知性,不建議使用finalize()和System.gc()來建議系統進行垃圾回收,因為這樣做不不能精準的控制垃圾回收機制.可以通過暗示使垃圾回收機制可以盡快的回收那些不再使用的對象.也就是將該對象的引用變量設置為null.
2. java程序的內存分配和回收都是由JRE在后臺進行維護.通常JRE會提供一個超級線程來進行檢測和控制,一般是在CPU空閑或內存不足的情況下自動進行的,程序員無法精確控制垃圾回收的時間和順序.
3. java運行時的數據存放在堆內存,垃圾回收機制就是負責這部分內存中的資源.它并不能回收其他如磁盤IO等物理資源.
4. 垃圾回收機制的缺點是它的開銷會影響程序的性能.JVM所做的就是監控程序中所有的對象,確認哪些是無用的對象,并最終釋放這些無用的對象.而且java的垃圾回收機制還不是很完備,它并不能保證可以100%地收集所有廢棄的內存.
5. 垃圾回收的精確性主要包括2個方面:
a. 垃圾回收機制可以精確地標記活著的對象.Java中的對象具有唯一性.
b. 垃圾回收機制可以精確地定位對象之間的引用關系.這是實現歸并和復制等算法的必要條件,通過這種引用關系,可以保證所有相關的對象都能被可靠的回收及重新分配,從而有效地減少內存碎片的產生
6. 現在的JVM有多種不同的垃圾回收機制,每種機制會因其算法差異而表現各異.有的當垃圾回收開始時就停止應用程序的運行,有的當垃圾回收運行時,同時允許應用程序運行,還有的同一時間垃圾回收有多個線程在運行.