衡阳派盒市场营销有限公司

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>java源碼下載>

java虛擬機工作原理及引用的四種狀態

大小:0.8 MB 人氣: 2017-09-27 需要積分:3
一、Java引用的四種狀態:
  強引用:
  用的最廣。我們平時寫代碼時,new一個Object存放在堆內存,然后用一個引用指向它,這就是強引用。
  *  如果一個對象具有強引用,那垃圾回收器絕不會回收它*。當內存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤,使程序異常終止,也不會靠隨意回收具有強引用的對象來解決內存不足的問題。
  軟引用:
  如果一個對象只具有軟引用,則內存空間足夠時,垃圾回收器就不會回收它;如果內存空間不足了,就會回收這些對象的內存。(備注:如果內存不足,隨時有可能被回收。)
  只要垃圾回收器沒有回收它,該對象就可以被程序使用。軟引用可用來實現內存敏感的高速緩存。
  弱引用:
  弱引用與軟引用的區別在于:只具有弱引用的對象擁有更短暫的生命周期。
  *  每次執行GC的時候,一旦發現了只具有弱引用的對象,不管當前內存空間足夠與否,都會回收它的內存。不過,由于垃圾回收器是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象*。
  虛引用:
  “虛引用”顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用并不會決定對象的生命周期。如果一個對象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時候都可能被垃圾回收器回收。
  虛引用主要用來跟蹤對象被垃圾回收器回收的活動。
  注:關于各種引用的詳解,可以參考這篇博客:
  http://zhangjunhd.blog.51cto.com/113473/53092
  二、Java中的內存劃分:
  Java程序在運行時,需要在內存中的分配空間。為了提高運算效率,就對數據進行了不同空間的劃分,因為每一片區域都有特定的處理數據方式和內存管理方式。
  java虛擬機工作原理及引用的四種狀態
  上面這張圖就是jvm運行時的狀態。具體劃分為如下5個內存空間:(非常重要)
  - 程序計數器:保證線程切換后能恢復到原來的執行位置
  - 虛擬機棧:(棧內存)為虛擬機執行java方法服務:方法被調用時創建棧幀–》局部變量表-》局部變量、對象引用
  本地方法棧:為虛擬機執使用到的Native方法服務
  堆內存:存放所有new出來的東西
  方法區:存儲被虛擬機加載的類信息、常量、靜態常量、靜態方法等。
  運行時常量池(方法區的一部分)
  GC對它們的回收:
  內存區域中的程序計數器、虛擬機棧、本地方法棧這3個區域隨著線程而生,線程而滅;棧中的棧幀隨著方法的進入和退出而有條不紊地執行著出棧和入棧的操作,每個棧幀中分配多少內存基本是在類結構確定下來時就已知的。在這幾個區域不需要過多考慮回收的問題,因為方法結束或者線程結束時,內存自然就跟著回收了。
  GC回收的主要對象:而J**ava堆和方法區**則不同,一個接口中的多個實現類需要的內存可能不同,一個方法中的多個分支需要的內存也可能不一樣,我們只有在程序處于運行期間時才能知道會創建哪些對象,這部分內存的分配和回收都是動態的,GC關注的也是這部分內存,后面的文章中如果涉及到“內存”分配與回收也僅指著一部分內存。
  1、程序計數器:(線程私有)
  每個線程擁有一個程序計數器,在線程創建時創建,
  指向下一條指令的地址
  執行本地方法時,其值為undefined
  說的通俗一點,我們知道,Java是支持多線程的,程序先去執行A線程,執行到一半,然后就去執行B線程,然后又跑回來接著執行A線程,那程序是怎么記住A線程已經執行到哪里了呢?這就需要程序計數器了。因此,為了線程切換后能夠恢復到正確的執行位置,每條線程都有一個獨立的程序計數器,這塊兒屬于“線程私有”的內存。
  2、Java虛擬機棧:(線程私有)
  每個方法被調用的時候都會創建一個棧幀,用于存儲局部變量表、操作棧、動態鏈接、方法出口等信息。局部變量表存放的是:編譯期可知的基本數據類型、對象引用類型。
  每個方法被調用直到執行完成的過程,就對應著一個棧幀在虛擬機中從入棧到出棧的過程。
  在Java虛擬機規范中,對這個區域規定了兩種異常情況:
  (1)如果線程請求的棧深度太深,超出了虛擬機所允許的深度,就會出現StackOverFlowError(比如無限遞歸。因為每一層棧幀都占用一定空間,而 Xss 規定了棧的最大空間,超出這個值就會報錯)
  (2)虛擬機棧可以動態擴展,如果擴展到無法申請足夠的內存空間,會出現OOM
  3、本地方法棧:
  (1)本地方法棧與java虛擬機棧作用非常類似,其區別是:java虛擬機棧是為虛擬機執行java方法服務的,而本地方法棧則為虛擬機執使用到的Native方法服務。
  (2)Java虛擬機沒有對本地方法棧的使用和數據結構做強制規定,Sun HotSpot虛擬機就把java虛擬機棧和本地方法棧合二為一。
  (3)本地方法棧也會拋出StackOverFlowError和OutOfMemoryError。
  4、Java堆:即堆內存(線程共享)
  (1)堆是java虛擬機所管理的內存區域中最大的一塊,java堆是被所有線程共享的內存區域,在java虛擬機啟動時創建,堆內存的唯一目的就是存放對象實例幾乎所有的對象實例都在堆內存分配。
  (2)堆是GC管理的主要區域,從垃圾回收的角度看,由于現在的垃圾收集器都是采用的分代收集算法,因此java堆還可以初步細分為新生代和老年代。
  (3)Java虛擬機規定,堆可以處于物理上不連續的內存空間中,只要邏輯上連續的即可。在實現上既可以是固定的,也可以是可動態擴展的。如果在堆內存沒有完成實例分配,并且堆大小也無法擴展,就會拋出OutOfMemoryError異常。
  5、方法區:(線程共享)
  (1)用于存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。
  (2)Sun HotSpot虛擬機把方法區叫做永久代(Permanent Generation),方法區中最終要的部分是運行時常量池。
  6、運行時常量池:
  (1)運行時常量池是方法區的一部分,自然受到方法區內存的限制,當常量池無法再申請到內存時就會拋出OutOfMemoryError異常。
  三、Java對象在內存中的狀態:
  可達的/可觸及的:
  Java對象被創建后,如果被一個或多個變量引用,那就是可達的。即從根節點可以觸及到這個對象。
  其實就是從根節點掃描,只要這個對象在引用鏈中,那就是可觸及的。
  可恢復的:
  Java對象不再被任何變量引用就進入了可恢復狀態。
  在回收該對象之前,該對象的finalize()方法進行資源清理。如果在finalize()方法中重新讓變量引用該對象,則該對象再次變為可達狀態,否則該對象進入不可達狀態
  不可達的:
  Java對象不被任何變量引用,且系統在調用對象的finalize()方法后依然沒有使該對象變成可達狀態(該對象依然沒有被變量引用),那么該對象將變成不可達狀態。
  當Java對象處于不可達狀態時,系統才會真正回收該對象所占有的資源。
  四、判斷對象死亡的兩種常用算法:
  當對象不被引用的時候,這個對象就是死亡的,等待GC進行回收。
 

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

java虛擬機工作原理及引用的四種狀態下載

相關電子資料下載

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      大发888娱乐场东南网| 百家乐双龙| 百家乐官网单人操作扫描道具| 盈禾娱乐| 威尼斯人娱乐城网址多少| 百家乐正网开户| 百家乐官网赢家电子书| 周口市| 棋牌室标语| 在线百家乐策| 澳门百家乐群官网| 棋牌百家乐官网有稳赚的方法吗| 百家乐官网览| 凤凰娱乐开户| 大发888网页版体育| 百家乐的路子怎么| 百家乐的路怎样看| 网上赌百家乐官网的玩法技巧和规则| 百家乐官网投注方法投资法| 金冠娱乐城官网| 德州扑克大小顺序| 威尼斯人娱乐成| 君怡百家乐官网的玩法技巧和规则| 百家乐官网之对子的技巧| 和政县| 香港六合彩曾道人| 大发888游戏平台888| 飞天百家乐的玩法技巧和规则 | 百家乐大光明影院| 百家乐推筒子| 百家乐最新套路| 下载百家乐官网的玩法技巧和规则 | 百家乐官网手机投注| 赌场里的美少年| bet365手机客户端| 大发888 casino官网| 威尼斯人娱乐城地址lm0| 电玩百家乐的玩法技巧和规则| 使用的百家乐软件| 网上百家乐平台下载| 金满堂百家乐官网的玩法技巧和规则 |