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 上运行。

纯属我的理解,不喜勿喷。。。

相关文章
相关标签/搜索