JVM--垃圾收集器,與內存配分策略

又看了《深入理解Java虛擬機》中關於收集器這一章。簡單做個總結,寫下自己的想法。

哪些內存需要回收?

程序計數器,虛擬機棧,本地方法棧,這3個區域隨線程而生,隨線程而滅。這也是爲什麼,逃逸分析技術,能幫助虛擬機減少GC次數(確定域中的類,可以在棧上創建實例),優化代碼,提高性能。

需要回收的內存,主要是堆,方法區(線程共享的區域)。堆分爲新生代(1/3),老年代(2/3),新生代下又分爲Eden(8/10),s1(1/10),s2(1/10)。方法區,存放類信息,也被稱爲永久代。

要做回收,首先要判斷,對象是否存活

目前是提供了這兩種算法,不排除,以後不會有新的算法:

 1.引用計數算法:引用計數放法,簡單有效,但是很難解決對象之間相互循環引用的問題。

 2.可達性分析算法:通過GC Roots 的對象作爲起始點。當一個對象到GC Roots沒有任何引用鏈相連,則證明此對象不可用。(通過OopMap,快速選擇GC Roots,而oopmap 是在類加載完成的時候,虛擬機把對象內什麼偏移量上是什麼類型的數據計算出來。而oopMap的生成,只在安全點生成。安全點的選擇,是以程序,是否具有讓程序長時間執行的特徵,我理解的,相對停留久的地方生成oop)

 

當能判斷對象,是否存活後。就將他們回收,JVM提供了3中回收對象的算法

 1.標記,清除。將需要回收的對象,標記。然後清除。這樣做,會產生空間碎片(邏輯上),而當需要申請內存時,沒有連續的邏輯空間,可供申請。

 2.複製。將內存分爲兩塊兒,同樣需要標記。內存快使用完時,將標記還存活的對象,複雜到另一塊內存區域。剩下內存,統一回收掉。

 3.標記,整理。同樣時標記,但是將標記的需要回收內存,向一端移動。清理邊界以外的內存

 

接下來

垃圾收集器,目前一共7中垃圾收集器。3種(Serial,ParNew,Parallel Scavenge),應用於新生代垃圾回收;3種(CMS,Serial old ,Paralel old)用於老年代的垃圾回收。最後一個G1收集器,既能針對於新生代,也能回收老年代。

瞭解垃圾收集器之前,應該先了解。並行和併發

並行:垃圾收集線程工作。應用線程等待。

併發:垃圾收集線程,應用線程,同時執行(併發執行。)

1.Serial 收集器:單線程收集器。主要時JDK1.3.1之前的收集器。現在已經不使用了。簡單高效,適合運行在Client模式下

2.ParNew收集器::多線程收集器,能和CMS收集器搭配使用。(新生代,老年代收集器,並不是所有都能搭配使用)。

3.Parallel Scavenge收集器:關注儘可能縮短垃圾收集時,用戶線程停頓時間,達到可控制的吞吐量。(和Parale old 搭配使用,時目前Jdk1.7,1.8的默認配置)

4.Serial old:同樣是單線程收集器(標記,整理算法)

5.Parallel Old:多線程收集器(標記,整理算法)

6.CMS收集器:是一種獲取最短回收停頓時間爲目標的收集器。適合互聯網,或者B/S系統服務端上。

7.G1收集器:每次根據允許的收集時間,優先回收價值最大的region。(jdk1.9默認配置)

CMS收集器和G1收集器,相對來說複雜很多。大致分爲:初始標記,併發標記,再次標記,回收。

 

說完完收集器。便是內存分配策略,和回收策略。

1.對象是優先在eden分配,沒有足夠空間時,執行Minor GC.(空間分配擔保)

2.大對象直接在老年代分配。(大對象爲什麼直接存放老年代呢?就因爲老年代空間大?放老年代,不是會執行full gc嘛?)

3.長期存活的對象進入老年代。

4.動態對象年齡判定。(如果在survivor空間相同年齡多有對象大小的總和大於survivor空間的一半,則升到老年代)。

 

最後一個,就是如何查看,jvm版本信息。以及如何配置jvm內存;

配置jvm內存:

1.直接通過去執行class文件的時候,也可以設置JVM參數,eg : java -Xms512m -Xmx1024m HelloWorld
在cmd中設置,也必須是執行java命令時

堆棧是JVM分配的,一般涉及的時候都是啓動JVM時。
2.eclipse可以在eclipse.ini 配置文件中設置,也可以在eclipse執行一個java類時,通過右鍵的參數添加部分去設置。
3.一般的像tomcat,weblogic這些web容器,都是應用jvm啓動的,所以在他們的啓動腳本中都會去調用JVM,就可以在他們的啓動腳本中設置堆棧的大小。

查看JVM配置:
 1.java -XX:+PrintFlagsFinal -version | grep :

 2.java -XX:+PrintCommandLineFlags -version

參考:https://www.cnblogs.com/pc-boke/articles/10247068.html

          https://www.cnblogs.com/parryyang/p/5750146.html

 

 

 

 

 

 

 

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