Resource From baeldung.com: [NOTE: 介紹JVM、簡單使用]html
1、JVM Garbage Collectors (java 平臺的垃圾收集器)java
在這篇快速指導中, 咱們會說說不一樣JVM 的GC實現的基礎。 除此以外, 咱們會找出怎樣在本身的應用中啓用一款適用應用的GC。程序員
顧名思義, GC就像是一個帶有發現並刪除內存垃圾的垃圾回收處理。但是,現實中,GC會跟蹤每一個JVM 堆空間的對象,並在適當的時候移除沒有用處的對象。簡單來講, GC工做方式分爲2步: 標記、清除後端
標記: GC會標記哪塊內存是可用的, 哪些是不可用的; 清除:這一步會移除有標記的對象。
優勢:數組
因爲沒用的內存空間會被GC自動處理,故無需手動作分配或者釋放內存的處理 沒有處理(懸空[dangling])指針的開銷 自動內存泄漏管理(GC不能確保完美無缺的解決方案來處理內存泄漏, 可是它會傾盡全力)
缺點:多線程
因爲JVM必須追蹤對象引用的建立和刪除, GC使得除了部署應用須要消耗資源,還須要更多的CPU資源。這可能會影響到請求的性能, 尤爲是一些須要大量內存的請求。 程序員沒法控制專門用於釋放再也不須要的對象在CPU時間片的調度。 用一些GC實現可能會致使應用意外終止。 自動內存管理不如手動內存分配/釋放內存更有效。
JVM 有4種類型的GC實現: 串行GC, 並行GC, CMS GC, G1 GC。 Ok 接下來一一介紹這幾類GC 實現oracle
串行GC(Serial Garbage Collector): 串行GC是最簡單的GC實現, 由於它基本上是以單線程工做。 所以, 此類GC在處理內存垃圾的時候,會暫停當前應用全部的線程。 因此, 對於在多線程應用中(好比 服務後端應用), 這並非一個很好的GC實現。 但是, 有一個比較有意思的觀點: 串行GC可讓人更好地理解垃圾回收器。串行 gc 是大多數應用程序的首選垃圾收集器, 這些應用程序沒有較小的暫停時間要求, 而且在以客戶端的計算機上運行。用串行GC 的命令: java -XX:+UseSerialGC -jar Application.java 並行GC(Parallel Garbage Collector): 並行GC 是JVM默認的GC, 又是叫作吞吐量回收器。不像串行GC, 它使用了多線程來管理heap space. 可是它也會在執行GC的時候,凍結應用線程。若是用這個GC, 能夠設置最大的GC線程、pause time(暫停時間)、吞吐量、佔用(堆大小)。 GC線程數目也能夠用命令行控制 -XX:ParallelGCThreads=<N>. 最大的暫停時間目標(以毫秒爲單位的2個GC的時間間隔)也能夠用命令行設定,以毫秒爲單位作設置 -XX:MaxGCPauseMillis=<N>. 最大的吞吐目標(以一個比值衡量GC吞吐率: 作GC用的時間/不作GC用的時間)也能夠用命令行設定 -XX:GCTimeRatio=<N>. 最大的堆佔用量(程序運行時所須要的堆內存佔用量) 能夠用JVM參數設置: -Xmx<N> 爲了開啓並行GC 可使用以下命名啓動java application: java -XX:+UseParallelGC -jar Application.java CMS GC(CMS Garbage Collector): 並行標記清除(CMS)的實現使用了多個gc 線程來作GC工做。這個GC實現側重於更短的gc停頓時間的應用, 而且在應用運行的時候,應用也能夠和gc一塊兒分享處理器資源。 簡單地說, 用這個類型的應用平均響應時間比較慢, 可是不會中止響應去執行GC。 這裏須要注意的是, 因爲GC是並行的,當GC並行垃圾回收時, 手動調用gc, 好比 System.gc()會致使並行模式[失敗/打斷]。 若是超過98%的時間都用於CMS GC 而且少於2%的堆被回收, 那麼CMS gc實現會拋出OOM。 必要的時候, 這個特徵也能夠命令行禁止 -XX:+UseGCOverheadLimit. 垃圾回收器也有一個模式叫作: 增加式模式,可是在java se 8中已通過時了, 在將來主打版本中可能被移除。 開啓CMS GC, 可用以下命名: java -XX:+UserParNewGC -jar Application.java G1 GC(G1 Garbage Collector): G1(優先回收)GC 旨在服務於那些運行在多核CPU而且大容量內存機器上的應用。 這個GC實現從JDK7及之後版本可用。 因爲高性能,G1 回收器會替代CMS GC。 不像其餘的GC, G1會把堆分區成若干同等大小的堆塊, 每一個堆塊都有一個連續的虛擬內存的合理區間。當執行GC時, G1會進行並行放入全局性標記階段(好比 phase 1 意爲Marking[標記]) 來決定在整個heap中的全部對象的存活時間。 標記階段完成後, G1就會知道哪些區域大多數是空的。它首先會收集這些區域, GC後這些區域一般會空出一大片區域(phase 2 意爲清除)。這就是爲何此GC實現方法叫作Garbage-First. 開啓G1 GC 的命令: java -XX:+UseG1GC -jar Application.java
java 8 對於GC的變化app
java8 已經引入了不少JVM參數不須要用內存來建立大量相同的String。 它是經過移除重複String值變成全局單一的數組char[]來優化了堆內存。性能
結論優化
本次快速指引中, 主要介紹了JVM GC 實現和他們的用法。對於幾種GC實現的使用和調整,參見 https://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html