一、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開始,尋找對應的引用節點,找到這個節點以后,繼續尋找這個節點的引用節點,當所有的引用節點尋找完畢之后,剩余的節點則被認為是沒有被引用到的節點,即無用的節點。
