異常:Java中異常機制用於捕獲例外事件,加強系統的容錯能力java
Java具備平臺無關性,對每種數據類型都分配了固定長度的空間,可是C++不一樣,在不一樣的平臺上會分配不一樣的字節數linux
http://www.javashuo.com/article/p-nhfhibef-cq.html程序員
類加載將Java字節碼載入到運行時數據區,執行引擎負責Java字節碼執行;算法
Java提供了動態加載的特性,只有在運行時第一次遇到類時纔會去加載和連接,而非在編譯時加載它。JVM的類加載器負責類的動態加載過程。Java類加載器的特色以下:編程
層次結構:Java的類加載器按是父子關係的層次結構組織的。Boostrap類加載器處於層次結構的頂層,是全部類加載器的父類。segmentfault
不能卸載: 類加載器能夠載入類卻不能卸載它。可是能夠經過刪除類加載器的方式卸載類。windows
每一個類加載器都有本身的空間,用於存儲其加載的類信息。當類加載器須要加載一個類時,它經過FQCN)(Fully Quanlified Class Name: 全限定類名)的方式先在本身的存儲空間中檢測此類是否已存在。在JVM中,即使具備相同FQCN的類,若是出如今了兩個不一樣的類加載器空間中,它們也會被認爲是不一樣的。存在於不一樣的空間意味着類是由不一樣的加載器加載的。
api
當JVM請示類加載器加載一個類時,加載器老是按照從類加載器緩存、父類加載器以及本身加載器的順序查找和加載類。也就是說加載器會先從緩存中判斷此類是否已存在,若是不存在就請示父類加載器判斷是否存在,若是直到Bootstrap類加載器都不存在該類,那麼當前類加載器就會從文件系統中找到類文件進行加載。數組
像Web應用服務器(WAS: Web Application Server)等框架經過使用用戶自定義加載器使Web應用和企業級應用能夠隔離開在各自的類加載空間獨自運行。也就是說能夠經過類加載器的委派模式來保證應用的獨立性。不一樣的WAS在自定義類加載器時會有略微不一樣,但都不外乎使用加載器的層次結構原理。緩存
若是一個類加載器發現了一個未加載的類,則該類的加載和連接過程以下圖
每一步的具體描述以下:
運行時數據區是JVM運行時操做系統分配的內存區域,運行時數據區可分爲6部分,即:爲每一個線程分別建立的PC寄存器,JVM棧,本地方法棧,和被全部線程共用的數據堆,方法區,和運行時常量池。
本地方法棧:爲非Java編寫的本地程序定義的棧空間,也就是說它基本上是用於經過JNI(Java Native Interface)方式調用和執行的C/C++代碼。根據具體狀況,C棧或C++棧將會被建立。
數據堆:堆中存儲着全部的類實例或對象,而且也是垃圾回收的目標場所。當涉及到JVM性能優化時,一般也會說起到數據堆空間的大小設置。JVM提供者能夠決定劃分堆空間或者不執行垃圾回收。
JVM經過類加載器把字節碼載入運行時數據區是由執行引擎執行的。執行引擎以指令爲單位讀入Java字節碼,就像CPU一個接一個的執行機器命令同樣。每一個字節碼命令包含一字節的操做碼和可選的操做數。執行引擎讀取一個指令並執行相應的操做數,而後去讀取並執行下一條指令。
儘管如此,Java字節碼仍是以一種能夠理解的語言編寫的,而不像那些機器直接執行的沒法讀懂的語言。因此JVM的執行引擎必需要把字節碼轉換爲能被機器執行的語言指令。執行引擎有兩種經常使用的方法來完成這一工做:
然而,即時編譯器在編譯代碼時比逐一解釋和執行每條指令更耗時,因此若是代碼只會被執行一次,解釋執行可能會具備更好的性能。因此JVM經過檢查方法的執行頻率,而後只對達到必定頻率的方法纔會作即時編譯。
可達性分析:這個算法的基本思路就是經過一系列的稱爲「GC Roots」的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連(用圖論的話來講,就是從GC Roots到這個對象不可達)時,則證實此對象是不可用的。
在Java語言中,可做爲GC Roots的對象包括下面幾種:
step2 : normal deletion
垃圾收集器清除掉標記出來的對象區域,簡單的清除帶來的問題是產生大量的不連續的內存碎片,空間碎片太多可能會致使在程序運行過程當中須要分配較大對象時,沒法找到足夠的連續內存而提早觸發一次垃圾回收
step 2 :improve -- deletion with compacting 壓縮整理
因爲簡單的清除可能會存在碎片的問題,因此又出現了壓縮清除的方法,也就是先清除須要回收的對象,而後再對內存進行壓縮操做,將內存分紅可用和不可用兩大部分。
新生代:全部new出來的新對象都在新生代,新生代這部份內存滿了以後,就會發起一次GC事件,這種發生在新生代的垃圾回收稱爲Minor collections,這種收集相對比較快。
永久代:The Permanent generation contains metadata required by the JVM to describe the classes and methods used in the application. The permanent generation is populated by the JVM at runtime based on classes in use by the application. In addition, Java SE library classes and methods may be stored here.
最後,咱們觀察上述過程能夠發現,大部分的垃圾收集過程都是在新生代進行的,直到老年代中的內存不夠用了纔會發起一次 major GC,會進行標記和整理壓縮。
建立階段(created)
爲對象分配存儲空間,開始構造對象,從父類到子類對static成員進行初始化,父類成員變量按照順序初始化,遞歸調用父類的構造方法,子類成員變量按照順序初始化,子類構造方法調用,一旦對象被建立,並有某個引用指向它,這個對象的狀態就切換到了應用階段(In Use)
對象空間的從新分配 垃圾回收器對該對象的所佔用的內存空間進行回收或者再分配了,則該對象完全消失了,稱之爲「對象空間從新分配階段」。