Java虛擬內存(棧、堆)


一、java虛擬的內存可以分為幾種

1. 第一種 棧(stack)

  • 棧的特點

    1.1 棧描述的是方法執行的內存模型,每個方法都被調用都會創建一個棧(存儲局部變量、操作數、

      方法出口等)

    1.2 JVM為每一個線程創建一個棧,用於存放該線程執行方法的信息(實際參數,局部變量等)

    1.3 棧屬於線程私有,不能實現線程間的共享!

    1.4 棧的存儲特點是“先進后出,后進先出”

    1.5 棧是由系統自動分配,速度快!棧是一個連續的內存空間!

2. 第二種 堆(heap)

  • 堆的特點如下:

    2.1 堆用於存儲創建好的對象和數組(數組也是對象)

    2.2 JVM只有一個堆,被所有線程共享

    2.3 堆是一個不連續的內存空間,分配靈活,速度慢!

3. 第三種 方法區(method area)

  • 方法區(又叫靜態區)特點如下:

    3.1 JVM只有一個方法區,被所有的線程共享!

    3.2 方法區實際也是堆,只是用於存儲類、常量相關的信息

    3.3 用來存放程序中永遠是不變或唯一的內容。(類 信息【Class對象】、靜態變量、字符串常量等)

 

二、 垃圾回收原理和算法

垃圾回收過程

  任何一種垃圾回收算法一般要做兩件基本事情:

  1. 發現無用的對象

  2. 回收無用對象占用的內存空間。

  垃圾回收機制保證可以將“無用的對象”進行回收。無用的對象指的就是沒有任何變量引用該對象。Java的垃圾回收器通過相關算法發現無用對象,並進行清除和整理。

垃圾回收相關算法

  1. 引用計數法

  堆中每個對象都有一個引用計數。被引用一次,計數加1. 被引用變量值變為null,則計數減1,直到計數為0,則表示變成無用對象。優點是算法簡單,缺點是“循環引用的無用對象”無法別識別。

 2. 引用可達法(根搜索算法)

  程序把所有的引用關系看作一張圖,從一個節點GC ROOT開始,尋找對應的引用節點,找到這個節點以后,繼續尋找這個節點的引用節點,當所有的引用節點尋找完畢之后,剩余的節點則被認為是沒有被引用到的節點,即無用的節點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM