JVM简要说明

90 阅读3分钟

JVM有五块区域分别是: 堆,方法区,方法栈,本地方法栈,程序计数器 各个区域的作用

堆: 存放实例的地方,程序编译启动后会把实例存在这里。

方法区: 编译后的类信息与常量词语

方法栈:每个线程都有一个方法栈区域,每个方法的调用都会创建一个栈帧

本地方法栈:线程私有的,native方法的调用栈

JVM的运行时内存(堆)

image.png 主要分为: 新生代(Eden,From Survivor,To Survivor),老生代(Old)

新生代

作用: 存放新创建的对象(大对象创建时直接存放在老生代)

MinnorGC复制算法(新生代使用的GC算法)

触发条件: 当新生代内存不够时

GC过程:

  1. Eden,survivorFrom ->survivorTo ,年龄+1
  2. 清空Eden,survivorFrom
  3. survivorTo,survivorFrom 互换 survivorTo作为下一次GC对象 (年龄达到15后挪到老生代)

老生代

作用:存放周期较长的对象(老生代存放不下对象时,会抛出内存溢出(Out of memory)异常)

MajorGC标记清除算法

触发条件: 老生代空间不够或者无法找到连续空间存放大对象时

GC过程:

标记出存活的对象,然后回收没有标记的对象,同时会对内存碎片合并标记。

垃圾回收算法

标记清除算法

标记->清除

image.png 缺点:内存碎片化严重

复制算法

把内存分为两个部分,一块用完了把对象挪到另一块,把已经使用的清除掉。

image.png

解决了内存碎片的问题

缺点: 当对象很多,效率很低

标记整理算法

标记后把活的对象挪到一端,清楚另外一端的对象

image.png

垃圾回收器

serial垃圾回收器(单线程,复制算法)

特点: 执行时需要停止所有线程,client模式下的默认新生代代垃圾收集器

ParNew垃圾回收器(Serial,多线程)

特点: 采用多线程,其他喝serial收集器一样,默认开启与cpu数目相同的线程数,server模式下的默认新生代收集器

Parallel Scavenge 收集器(多线程复制算法、高效)

特点: 高吞吐量,使用于后天运算多,而不需要太多交互的程序

Serial Old收集器(单线程标记整理算法)

特点:使用标记整理算法,client模式下的默认老年代收集算器

Parallel Old收集器(多线程标记整理算法)

特点; Parallel Scavenge的年老代版本,高吞吐量

搭配:高吞吐量的系统:Parallel Scavenge + Parallel Old

CMS收集器(多线程标记清除算法)

特点:获得最短的垃圾回收时间

G1收集器

特点:

  1. 基于标记-整理算法,不产生内存碎片。

  2. 可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收

3.为了避免全区收集,把堆划分为几个独立区域