在這篇教程中我們將學習幾種現有的垃圾回收器。在java中,垃圾回收是一個自動的進程可以替代程序員進行內存的分配與回收這些復雜的工作。這篇是垃圾回 收教程系列的第三篇,在前面的第2部分我們看到了在java中垃圾回收是如何工作的,那是篇有意思的文章,我推薦你去看一下。第一部分介紹了java的垃圾回收,主要有jvm體系結構,堆內存模型和一些java術語。
java有四種類型的垃圾回收器:
串行垃圾回收器(serial garbage collector)
并行垃圾回收器(parallel garbage collector)
并發標記掃描垃圾回收器(cms garbage collector)
g1垃圾回收器(g1 garbage collector)
每種類型都有自己的優勢與劣勢。重要的是,我們編程的時候可以通過jvm選擇垃圾回收器類型。我們通過向jvm傳遞參數進行選擇。每種類型在很大程度上有所不同并且可以為我們提供完全不同的應用程序性能。理解每種類型的垃圾回收器并且根據應用程序選擇進行正確的選擇是非常重要的。
1、串行垃圾回收器
串行垃圾回收器通過持有應用程序所有的線程進行工作。它為單線程環境設計,只使用一個單獨的線程進行垃圾回收,通過凍結所有應用程序線程進行工作,所以可能不適合服務器環境。它最適合的是簡單的命令行程序。
通過jvm參數-xx:+useserialgc可以使用串行垃圾回收器。
2、并行垃圾回收器
并行垃圾回收器也叫做throughputcollector。它是jvm的默認垃圾回收器。與串行垃圾回收器不同,它使用多線程進行垃圾回收。相似的是,它也會凍結所有的應用程序線程當執行垃圾回收的時候
3、并發標記掃描垃圾回收器
并發標記垃圾回收使用多線程掃描堆內存,標記需要清理的實例并且清理被標記過的實例。并發標記垃圾回收器只會在下面兩種情況持有應用程序所有線程。
當標記的引用對象在tenured區域;
在進行垃圾回收的時候,堆內存的數據被并發的改變。
相比并行垃圾回收器,并發標記掃描垃圾回收器使用更多的cpu來確保程序的吞吐量。如果我們可以為了更好的程序性能分配更多的cpu,那么并發標記上掃描垃圾回收器是更好的選擇相比并發垃圾回收器。
通過jvm參數xx:+useparnewgc打開并發標記掃描垃圾回收器。
4、g1垃圾回收器
g1垃圾回收器適用于堆內存很大的情況,他將堆內存分割成不同的區域,并且并發的對其進行垃圾回收。g1也可以在回收內存之后對剩余的堆內存空間進行壓縮。并發掃描標記垃圾回收器在stw情況下壓縮內存。g1垃圾回收會優先選擇第一塊垃圾最多的區域
通過jvm參數–xx:+useg1gc使用g1垃圾回收器
java8的新特性
在使用g1垃圾回收器的時候,通過jvm參數-xx:+usestringdeduplication。我們可以通過刪除重復的字符串,只保留一個char[]來優化堆內存。這個選擇在java8u20被引入。
我們給出了全部的四種java垃圾回收器,需要根據應用場景,硬件性能和吞吐量需求來決定使用哪一種。
垃圾回收的jvm配置
下面的jvm關鍵配置都與java垃圾回收有關。
運行的垃圾回收器類型
配置 | 描述 |
---|---|
-xx:+useserialgc | 串行垃圾回收器 |
-xx:+useparallelgc | 并行垃圾回收器 |
-xx:+useconcmarksweepgc | 并發標記掃描垃圾回收器 |
-xx:parallelcmsthreads= | 并發標記掃描垃圾回收器 =為使用的線程數量 |
-xx:+useg1gc | g1垃圾回收器 |
gc的優化配置
配置 | 描述 |
---|---|
-xms | 初始化堆內存大小 |
-xmx | 堆內存最大值 |
-xmn | 新生代大小 |
-xx:permsize | 初始化永久代大小 |
-xx:maxpermsize | 永久代最大容量 |
使用jvm gc參數的例子
1
|
java -xmx12m -xms3m -xmn1m -xx:permsize=20m -xx:maxpermsize=20m -xx:+useserialgc -jar java-application.jar |
總結
以上就是本文關于簡單了解java垃圾回收器的種類的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://www.importnew.com/13827.html