Java GC调优(上)
简介
图1
Java-HotSpot是什么?
虚拟机(JVM)版本是25.4-b25
java -version出来信息包含两部分:
Java软件包发行版本信息和内核(JVM)版本信息。
java的发行包包含三种类型Java ME,Java SE,Java EE,发行包就相当于对外销售的产品包,
不同发行包会删减部分特性,因此版本信息首先显示发行包类型和版本。
JVM是Java平台的基础和核心,一般在一个java大版本中JVM版本变化都是比较小的。
HotSpot是一种JVM实现技术,相对以往的方式在性能和扩展能力上得到了很大的提升,因此它不是一个独立产品,可以理解Sun(Oracle)实现的JVM版本的品牌商标。
1.JVM体系结构
方法区和堆是GC的作用区。
2.常用的GC算法
1).引用计数算法(Reference Counting GC)简称 直接垃圾回收
图1:
缺点:
1.每次对象赋值,都要对计算器做维护,而且计算器有一定的消耗。
2.循环引用,无法收回,且并不能判断它们是否死亡
注:JVM并不采用此种方式。
2).追踪(Tracing GC ) 简称 间接垃圾收集
- 标记-清除 (Mark-Sweep)
- 标记-复制 (Mark-Copying)
- 标记-整理 (Mark-Compact)
图2:
标记清除(Mark Sweep)
原理:
1.标记 从root开始进行扫描,对存活的对象进行标记。
2.清除
扫描整个内存空间,回收未标记的对象,使用free-list记录可用区域。
会产生大量不连续的碎片空间,需要进行两次的扫描,耗时严重。不需要额外的内存空间。
标记复制(Mark-Copying)
原理:从跟(GC Root)集合开始,通过Traceing从from找存活的对象,拷贝到to中。
from、to身份交换,下面从to中分配开始:
没有标记和清除,效率高。
没有内存碎片,可以利用bump-the-pointer实现快速内存分配。
标记整理 (Mark-Compact)
原理
标记
与标记-清除一样
整理(压缩)
没有内存碎片,可以利用bump-the-pointer实现快速内存分配。
移动成本高
标记-清除-整理
原理:
Mark-sweep与Mark-compact结合
和Mark-sweep一样,当进行多次GC后,再进行compact 减少移动队形的成本。
3.HotSpot 内存管理
不同的对象不同的生命周期不一样,98%以上都是临时的对象。
根据各代特点应用不同的GC算法,提高效率
GC回收类型
部分收集
- Mintor GC/Young GC 回收新生代的GC
- Magjor GC/Old GC 回收老年代的GC (目前只有CMS收集器会有单独收集老年代的行为)
- Mixed GC/Young GC and other Old GC (目前只有G1收集器有这种行为)
整堆收集
- Full GC :收集整个Java堆和方法区的垃圾收集。(永久代,新生代,旧生代三者)
新生代
- 有Eden区和Survivor区,默认比列8:1. Survivor分为from/to (so/s1),to总为空。
- 一般在Eden区分配对象,优化:本地线程分配缓冲 TLAB(Thread Local Allocation Buffer)
- 保存80%-90%生命周期较短的对象,GC频率高,采用效率较高的复制算法。
旧生代
存放着多次经理GC存活的对象;
新创建的大对象有可能直接进入旧生代,具体要看GC的实现
GC频率相对较低,标记-清除-整理各种结合和优化。