JVM有五块区域分别是: 堆,方法区,方法栈,本地方法栈,程序计数器 各个区域的作用
堆: 存放实例的地方,程序编译启动后会把实例存在这里。
方法区: 编译后的类信息与常量词语
方法栈:每个线程都有一个方法栈区域,每个方法的调用都会创建一个栈帧
本地方法栈:线程私有的,native方法的调用栈
JVM的运行时内存(堆)
主要分为:
新生代(Eden,From Survivor,To Survivor),老生代(Old)
新生代
作用: 存放新创建的对象(大对象创建时直接存放在老生代)
MinnorGC复制算法(新生代使用的GC算法)
触发条件: 当新生代内存不够时
GC过程:
- Eden,survivorFrom ->survivorTo ,年龄+1
- 清空Eden,survivorFrom
- survivorTo,survivorFrom 互换 survivorTo作为下一次GC对象 (年龄达到15后挪到老生代)
老生代
作用:存放周期较长的对象(老生代存放不下对象时,会抛出内存溢出(Out of memory)异常)
MajorGC标记清除算法
触发条件: 老生代空间不够或者无法找到连续空间存放大对象时
GC过程:
标记出存活的对象,然后回收没有标记的对象,同时会对内存碎片合并标记。
垃圾回收算法
标记清除算法
标记->清除
缺点:内存碎片化严重
复制算法
把内存分为两个部分,一块用完了把对象挪到另一块,把已经使用的清除掉。
解决了内存碎片的问题
缺点: 当对象很多,效率很低
标记整理算法
标记后把活的对象挪到一端,清楚另外一端的对象
垃圾回收器
serial垃圾回收器(单线程,复制算法)
特点: 执行时需要停止所有线程,client模式下的默认新生代代垃圾收集器
ParNew垃圾回收器(Serial,多线程)
特点: 采用多线程,其他喝serial收集器一样,默认开启与cpu数目相同的线程数,server模式下的默认新生代收集器
Parallel Scavenge 收集器(多线程复制算法、高效)
特点: 高吞吐量,使用于后天运算多,而不需要太多交互的程序
Serial Old收集器(单线程标记整理算法)
特点:使用标记整理算法,client模式下的默认老年代收集算器
Parallel Old收集器(多线程标记整理算法)
特点; Parallel Scavenge的年老代版本,高吞吐量
搭配:高吞吐量的系统:Parallel Scavenge + Parallel Old
CMS收集器(多线程标记清除算法)
特点:获得最短的垃圾回收时间
G1收集器
特点:
-
基于标记-整理算法,不产生内存碎片。
-
可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收
3.为了避免全区收集,把堆划分为几个独立区域