Java 运行时的内存划分
生活随笔
收集整理的這篇文章主要介紹了
Java 运行时的内存划分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java 運行時的內存劃分
程序計數器
記錄當前線程所執行的字節碼行號,用于獲取下一條執行的字節碼。
當多線程運行時,每個線程切換后需要知道上一次所運行的狀態、位置。由此也可以看出程序計數器是每個線程私有的。
虛擬機棧
虛擬機棧由一個一個的棧幀組成,棧幀是在每一個方法調用時產生的。
每一個棧幀由局部變量區、操作數棧等組成。每創建一個棧幀壓棧,當一個方法執行完畢之后則出棧。
- 如果出現方法遞歸調用出現死循環的話就會造成棧幀過多,最終會拋出?StackOverflowError。
- 若線程執行過程中棧幀大小超出虛擬機棧限制,則會拋出?StackOverFlowError。
- 若虛擬機棧允許動態擴展,但在嘗試擴展時內存不足,或者在為一個新線程初始化新的虛擬機棧時申請不到足夠的內存,則會拋出?OutOfMemoryError。
這塊內存區域也是線程私有的。
Java 堆
Java?堆是整個虛擬機所管理的最大內存區域,所有的對象創建都是在這個區域進行內存分配。
這塊區域也是垃圾回收器重點管理的區域,由于大多數垃圾回收器都采用分代回收算法,所有堆內存也分為?新生代、老年代,可以方便垃圾的準確回收。
這塊內存屬于線程共享區域。
方法區
方法區主要用于存放已經被虛擬機加載的類信息,如常量,靜態變量。 這塊區域也被稱為永久代。
運行時常量池
運行時常量池是方法區的一部分,其中存放了一些符號引用。當 new 一個對象時,會檢查這個區域是否有這個符號的引用。
總結
以上是生活随笔為你收集整理的Java 运行时的内存划分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ConcurrentHashM
- 下一篇: 如何成为一位「不那么差」的程序员