java內存

java內存分配:
根據是否是線程來佔有的:
線程獨享的:
程序計數器 :記錄當前線程執行到的行數(如果當前執行的是native方法的話,則計數器的值爲undefined)
虛擬機棧:   每個方法被執行的時候,都被會創建一個幀棧,用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。
本地方法棧    爲本地(native)方法提供的內存區域

虛擬機相關的(線程共享的):
堆          存放對象實例的 
方法區 存儲已被java虛擬機加載的類信息,常量,靜態變量,即時編譯器 編譯後的代碼等數據 
運行時常量池:(方法區的一部分)存放了編譯期生成的各種字面量和符號引用,和運行期間產生的新的常量

直接內存(非虛擬機運行時數據區的一部分)


垃圾回收的區域:
    和線程相關的 虛擬機棧,本地方法棧,pc計數器所佔用的空間是確定的,分配和回收隨着線程的開始和結束而進行的。

虛擬機相關的內存區域是回收的重點,即堆和方法區。


內存分配:
   對象優先在eden區分配
大對象直接進入老年代
    長期存活的對象會晉升到老年代

判斷對象是否已死的算法:
   1.引用計數法
   2.根搜索算法  java 虛擬機採用的方式 (可以防止循環引用) 如果某個對象到GC Roots沒有任何引用鏈,那麼這個對象就是不可達的,會被垃圾回收器回收掉。
     可以作爲GC Roots的對象:
    虛擬機棧中引用的對象
本地方法棧中引用的對象
方法區中的類靜態變量引用的對象
方法區中的常量引用的對象

引用的類型
1.強引用 不會被垃圾回收掉的引用
2.軟引用 在將要發生內存溢出的時候,GC進行垃圾回收之後發現還是不能避免溢出的時候,會回收這類引用的對象
3.弱引用 在下一次GC時會被回收的對象
4.虛引用

方法區的回收:

    1.廢棄的常量
2.無用的類




名稱 作用區域 特點 優點
Serial 新生代 單線程收集器,在回收的時候會暫停其他線程的工作(stop the world) 在單個CPU的環境下,可以獲得最高的單線程收集效率,適用於運行在client模式下的虛擬機的新生代gc首選

ParNew 新生代 Serial的多線程版本 是運行在server模式下的虛擬機首選的新生代收集器

Parallel scavenge 新生代 主要用於控制吞吐量。複製算法,並行的多線程收集器,提供了自適應策略 適合在後臺運算,而不需要太多交互的場合
Serial old 老年代 Serial的老年代版本 1.在1.5之前與 parallel scavenge搭配
2.作爲CMS收集器的後背預案

Parallel old 老年代 Parallel scavenge的老年代版本 標記-整理算法 在注重吞吐量及cpu資源敏感的場合優先考慮
Concurrent mark sweep  CMS 老年代 標記-清除算法
四步:
初始標記(stop the world)
併發標記
重新標記(stop the world)
併發清除

以獲取最短回收停頓爲目標


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章