首先要說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配置成相等的這樣能夠減小MajorGc的調用,數值通常配置爲可用物理內存的80%。xmn配置爲Xmn的30%。配置permSize須要根據咱們部署的項目多少,以及jar包的多少來配置。若是jar包比較多,就須要配大一點。
---------------------------------------分割線--------------------------------------------------
常見的內存溢出異常:
---------------------------------------分割線--------------------------------------------------
垃圾回收算法:
---------------------------------------分割線--------------------------------------------------
常見垃圾回收器
併發:指用戶線程和垃圾回收線程同時執行(不必定是並行,有多是交叉執行),用戶進程在運行,而垃圾回收線程在另外一個 CPU 上運行。
純屬我的理解,不喜勿噴。。。