在這篇教程中咱們將學習幾種現有的垃圾回收器。在Java中,垃圾回收是一個自動的進程能夠替代程序員進行內存的分配與回收這些複雜的工做。這篇是垃圾回 收教程系列的第三篇,在前面的第2部分咱們看到了在Java中垃圾回收是如何工做的,那是篇有意思的文章,我推薦你去看一下。第一部分介紹了Java的垃 圾回收,主要有JVM體系結構,堆內存模型和一些Java術語。html
Java有四種類型的垃圾回收器:java
每種類型都有本身的優點與劣勢。重要的是,咱們編程的時候能夠經過JVM選擇垃圾回收器類型。咱們經過向JVM傳遞參數進行選擇。每種類型在很大程度上有 所不一樣而且能夠爲咱們提供徹底不一樣的應用程序性能。理解每種類型的垃圾回收器而且根據應用程序選擇進行正確的選擇是很是重要的。程序員
串行垃圾回收器經過持有應用程序全部的線程進行工做。它爲單線程環境設計,只使用一個單獨的線程進行垃圾回收,經過凍結全部應用程序線程進行工做,因此可能不適合服務器環境。它最適合的是簡單的命令行程序。shell
經過JVM參數-XX:+UseSerialGC
可使用串行垃圾回收器。編程
並行垃圾回收器也叫作 throughput collector 。它是JVM的默認垃圾回收器。與串行垃圾回收器不一樣,它使用多線程進行垃圾回收。類似的是,它也會凍結全部的應用程序線程當執行垃圾回收的時候服務器
併發標記垃圾回收使用多線程掃描堆內存,標記須要清理的實例而且清理被標記過的實例。併發標記垃圾回收器只會在下面兩種狀況持有應用程序全部線程。多線程
相比並行垃圾回收器,併發標記掃描垃圾回收器使用更多的CPU來確保程序的吞吐量。若是咱們能夠爲了更好的程序性能分配更多的CPU,那麼併發標記上掃描垃圾回收器是更好的選擇相比並發垃圾回收器。併發
經過JVM參數 XX:+USeParNewGC
打開併發標記掃描垃圾回收器。app
G1垃圾回收器適用於堆內存很大的狀況,他將堆內存分割成不一樣的區域,而且併發的對其進行垃圾回收。G1也能夠在回收內存以後對剩餘的堆內存空間進行壓縮。併發掃描標記垃圾回收器在STW狀況下壓縮內存。G1垃圾回收會優先選擇第一塊垃圾最多的區域jvm
經過JVM參數 –XX:+UseG1GC
使用G1垃圾回收器
在使用G1垃圾回收器的時候,經過 JVM參數 -XX:+UseStringDeduplication
。 咱們能夠經過刪除重複的字符串,只保留一個char[]來優化堆內存。這個選擇在Java 8 u 20被引入。
咱們給出了所有的四種Java垃圾回收器,須要根據應用場景,硬件性能和吞吐量需求來決定使用哪種。
下面的JVM關鍵配置都與Java垃圾回收有關。
配置 | 描述 |
---|---|
-XX:+UseSerialGC | 串行垃圾回收器 |
-XX:+UseParallelGC | 並行垃圾回收器 |
-XX:+UseConcMarkSweepGC | 併發標記掃描垃圾回收器 |
-XX:ParallelCMSThreads= | 併發標記掃描垃圾回收器 =爲使用的線程數量 |
-XX:+UseG1GC | G1垃圾回收器 |
配置 | 描述 |
---|---|
-Xms | 初始化堆內存大小 |
-Xmx | 堆內存最大值 |
-Xmn | 新生代大小 |
-XX:PermSize | 初始化永久代大小 |
-XX:MaxPermSize | 永久代最大容量 |
1
|
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
|
在Java垃圾回收教程的下一部分,咱們將會用一個Java程序演示如何監視和分析垃圾回收。
原文連接: javapapers 翻譯: ImportNew.com - 好好先生
譯文連接: http://www.importnew.com/13827.html