JVM总结---各处总结
堆與棧分開設計是為什么呢?
- 棧存儲了處理邏輯、堆存儲了具體的數據,這樣隔離設計更為清晰
- 堆與棧分離,使得堆可以被多個棧共享。
- 棧保存了上下文的信息,因此只能向上增長;而堆是動態分配
?
?線程棧
1、每當啟動一個新線程的時候,java虛擬機都會為它分配一個java棧;
2、虛擬機只會對java棧執行兩種操作:以棧幀為單位的壓棧或者出棧;
3、它壓入的每個棧幀(Stack Frame)是----程序指令 ?以及 ? 局部變量表 ,每個方法調用對應一個棧幀。
局部變量表
包括==>:①各種基本數據類型;②對象的引用。
各種基本數據類型:
boolean、byte、char、short、int、float、long、double ;
?
4、我們需要注意到:每個 線程 都有 獨立的棧 并且是互相隔離的。
棧的大小可以受到幾個因素影響:
1??一個是jvm參數 -XSS ?;
2??除了JVM設置,我們還可以在創建線程Thread的時候手工指定大小:?
你在創建線程的時候參數傳遞進去,默認是1M
?
----------------------------------------------------------------------------------------
堆
1、Java 堆(Java Heap)是Java 虛擬機所管理的內存中最大的一塊;
2、Java 堆是被所有線程共享的一塊內存區域,在虛擬機啟動時創建;
3、此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存;
①首先堆可以劃分為新生代和老年代
新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數 –XX:NewRatio 來指定 )
②新生代又可以劃分為一個Eden區和兩個Survivor(幸存)區?
1、按照規定,新對象會首先分配在Eden中(如果對象過大,比如大數組,將會直接放到老年代)。
2、在GC中,Eden中的對象會被移動到survivor中,直至對象滿足一定的年紀(定義為熬過minor GC【當Eden區滿時,觸發Minor GC】的次數),會被移動到老年代。
3、默認的,Eden : from : to = 8 : 1 : 1 ( 可以通過參數 –XX:SurvivorRatio 來設定 ),即: Eden = 8/10 的新生代空間大小,from = to = 1/10 的新生代空間大小。 ③靜態方法區,又稱為永久代(Perm Generation)它用于存儲已被虛擬機加載的 ?類信息 ,常量, 靜態變量, 即時編譯后的代碼 ??等數據?
?
-----------------------------------------------------------------------------
①Minor GC ?和 Full GC
Minor GC觸發條件
:當Eden,Survivor區滿時,觸發Minor GC。
Minor GC ---采用的垃圾回收機制是 復制算法?
因為:新生代每次垃圾回收倒要回收大部分的對象,也就說需要復制的操作次數較少,
但是在實際中并不是按照1:1比例來劃分新生代空間的,一般來說,將新生代劃分為一塊較大的Eden代和兩塊較小的Survivor代,比例大概是
8:1:1;每次只是用Eden代,當進行回收時,將Eden代還存活的對象復制到一塊Survor1對象中,然后清理掉
Eden代。第二次MinorGC會清理Eden代和Survor1,將對象存放到Survor2中,然后將Eden代和Survor1中的對象清理掉。當Survor2中的對象放不下的時候,會存放到 老年代;
?
?
Full GC觸發條件:
(1)調用System.gc時,系統建議執行Full GC,但是不必然執行
(2)老年代空間不足
(3)方法區空間不足
(4)通過Minor GC后進入老年代的平均大小》大于老年代的可用內存
(5)由Eden區、From Space區向To Space區復制時,對象大小大于To Space可用內存,則把該對象轉存到老年代,且老年代的可用內存小于該對象大小
使用到的垃圾回收算法:Mark-Compact算法
由于老年代的特點是每次回收的都是少量對象,一般使用的是 Mark-Compact 算法
?
轉載于:https://www.cnblogs.com/yunshenbuzhichu/p/9676302.html
總結
以上是生活随笔為你收集整理的JVM总结---各处总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [阿里云]I+的一些探索
- 下一篇: Api文档生成工具与Api文档的传播(p