Gc調優概述···

首先要說Jvm,先來講一說Jvm,Jre,JDK三者的關係吧!以下圖:java

JDK:做爲軟件開發工做包,包含有JRE和一些工具類的包。算法

JRE:爲java程序運行提供必要的環境,由JVM和Java的Api組成。服務器

JVM:簡單點理解就是,經過一些規定和存儲分區以及gc管理使java程序能更好的運行。多線程

---------------------------------------分割線--------------------------------------------------併發

下面就要來講說JVM了,我按照簡版的最好理解的來講。工具

主要分爲堆內存,棧內存,non Heap區。優化


比較流行的將堆分爲新生代和年老代。spa

新生代分爲Eden,survivor1,survovor2,內存空間分配爲8:1:1。用的時候只用Eden和其中一個存活區,等到執行MinorGc的時候將未被回收的對象放到另外一個存活區中。MinorGc負責新生代的垃圾回收,執行頻率高,速度比較快。線程

年老代,在新生代中通過屢次MinorGc未被回收的進入年老代。majorGc負責年老代的垃圾回收。執行頻率低,速度是MinorGc的十倍之久。咱們能夠經過內存配置來優化它。3d

---------------------------------------分割線--------------------------------------------------

Gc優化的參數:

  • -xms:啓動時堆內存初始大小。
  • -xmx:堆內存最大值。
  • -xmn:新生代空間大小,剩下的就是年老代的空間大小。
  • --xx:permSize:永久代初始化空間大小。
  • --xx:MaxPermSize:永久代最大值。
咱們在配置時通常將xms和xmx配置成相等的這樣能夠減小MajorGc的調用,數值通常配置爲可用物理內存的80%。xmn配置爲Xmn的30%。配置permSize須要根據咱們部署的項目多少,以及jar包的多少來配置。若是jar包比較多,就須要配大一點。


---------------------------------------分割線--------------------------------------------------

常見的內存溢出異常:

  1. outofMemoryError:permGen space——非堆溢出(永久保存區異常),通常項目jar包太多。永久內存不夠,把permSize調大點就行了。
  2. outofMemoryError:java heap space——堆溢出,xms調大點
  3. outofMemoryError:unable to create new native thread——棧溢出,沒法建立新線程,比較少見。
內存監視工具:Jconsole(Java安裝目錄Bin文件夾下邊去找找)


---------------------------------------分割線--------------------------------------------------

垃圾回收算法:

  • 標記算法:直接標記清除(效率不高空間會產生大量碎片)
  • 複製算法:原始的複製算法是將新生代分爲兩部分,每次只使用其中一部分,執行minorGc的時候,將未被回收的放到另外一部分中。這樣每次只能使用一個。內存浪費比較大。優化後的複製算法是將新生代分紅3部分一個Eden區(對象出生的地),兩個survivor區,內存佔比8:1:1。每次只使用Eden和其中一個survivor區,執行minorGc的時候,將存活的對象放到另外一個survivor分區中,這樣使得內存不被浪費。
  • 分代回收:分紅新生代和老年代,不一樣的分區採用不一樣的方法。
  • 標記整理:對應老年代比較適合。

---------------------------------------分割線--------------------------------------------------

常見垃圾回收器

  1. serial收集器:單線程垃圾回收器,只用一個cpu,一條線程。
  2. parNew:多線程版本的serial收集器。
  3. parallel Scavenge:並行的多線程收集器,採用複製算法。以吞吐量優先。
  4. parallel old 和serial old 是針對老年代的版本。
  5. CMS:採用標記清除的算法,適合年老代,以最短停頓時間爲目標。
  6. GI收集器:面向服務器端的垃圾收集器。
並行:指多條垃圾收集線程並行工做,此時用戶線程處於等待狀態

併發:指用戶線程和垃圾回收線程同時執行(不必定是並行,有多是交叉執行),用戶進程在運行,而垃圾回收線程在另外一個 CPU 上運行。

純屬我的理解,不喜勿噴。。。

相關文章
相關標籤/搜索