? ? ? ? ? ? ? ? ? ? ?JAVA內存區域與內存溢出異常
一 Java內存區域
? ? ? Java虛擬機在執行java程序的過程中會把它管理的內存劃分為若干個不同的數據區域,Java虛擬機所管理的內存包含以下幾個運行時數據區域。
? ? ?1.程序計數器
? ? ? ? ? ? ?程序計數器是一塊比較小的內存空間,它可以看做是當前線程所執行的字節碼的行號指示器。字節碼解釋器工作就是通過改變計數器的值來選取下一條執行的指令,分支、循環、異常處理,線程恢復等基礎功能都需要依賴計數器去完成。
? ? ? ? ? ? Java虛擬機的多線程是通過線程輪流切換并分配處理器執行時間的方式來實現,每條線程都有一個獨立的程序計算器,各個線程之間計數器互不影響,獨立存儲
? ? ?2.Java虛擬機棧
? ? ? ? ? ? a.虛擬機棧是線程私有的? ? b.聲明周期與線程一樣? c.局部變量表中可以存放各種基礎數據類型,對象引用 ,其中 64位長度的long和double類型的數據占兩個局部變量空間,其他的占一個,局部變量所需的內存空間在編譯期間完成分配。 d.如果線程請求的棧深度大于虛擬機允許的深度,拋出StackOverflowError;如果虛擬機可以動態擴展,擴展時沒法申請到足夠的內存,拋出OutOfMemoryError.
? ? ?3.本地方法棧
? ? ? ? ? ? 與虛擬機棧的作用很相似,不過本地方法棧是為Native方法服務,虛擬機棧為執行java方法服務
? ? ?4.Java堆
? ? ? ? ? ? a.被所有線程共享 b.在虛擬機啟動時創建 c.存放對象實例 d.堆中沒有存在完成實例分配,并且堆也無法再擴展,拋出OutOfMemoryEoor
? ? ?5.方法區
? ? ? ? ? ?a.被所有線程共享 b.存放編譯器編譯后的數據,類信息,常量,靜態變量 ?c.可以不實現垃圾收集 ? ? d.當方法區無法滿足內存分配時拋出OutOfMemoryError
? ? ?6.常量池
常量池是方法區的一部分,Class文件中除了有類的版本,字段,方法,接口等信息外,還有常量池,用于存在基本類型和對象類型、以文本形式的符號引用。比如:類和接口的全限定名;字段和方法的名稱與描述符;,編譯時,如果發現對其它類方法的調用或者對其它類字段的引用的話,記錄進class文件中的只能是一個文本形式的符號引用,在連接過程中,虛擬機根據這個文本信息去查找對應的方法或字段