您的位置:首页 > 其它

JVM GC笔记

2015-03-29 17:17 99 查看
堆分区:所有new的对象都会存放在堆中

> 新生代(Young Generation):存放生命周期短的对象,具体还分为Eden和Survivor两个区,其中Survivor分为From Space和To Space;
> 旧生代(Old Generation):存放生命周期长的对象
> 持久代(Permenent Generation):用于存放class字节码等

JVM使用的GC算法是:分代收集
> 频繁的收集新生代
> 较少的收集旧生代
> 基本不收集持久代

JVM的GC机制分为:Minor GC 和 Full GC
> Minor GC: 即普通GC,负责收集新生代里所有对象,会把Eden里所有活着的对象复制到Survivor里,如果Survivor放不下,则把Survivor里活着的对象放入旧生代里
> Full GC:会对新生代和旧生代进行收集,算法不同效率会低于GC。显式调用System.gc()时,就是进行Full GC。
> 触发条件:Eden满了触发Minor GC;有新对象进入旧生代时,旧生代空间不足则进行Full GC

JVM的清理算法:
> 引用计数法(早期JVM):JVM会为对象的引用数进行计数,创建则添加,引用超出范围则删减,当计数为0时,则可以收集
> 对象引用遍历:JVM会遍历所有根对象,根据对象图递归确定可到达对象,如果某对象实例可以从根对象到达,则将其标记,称为标记对象;在执行收集阶段,只需要简单的扫描堆栈,删除所有未标记对象即可。一般在之后还会进行压缩,以便为新的对象腾出空间。
  > 复制清理法

JVM如何清理一个对象:
> 新生代:采用复制清理法,扫描后把可到达的对象复制到未使用的区域,如survivor里,然后清楚Eden里所有对象
> 旧生代:采用标记清理然后压缩,内容见对象引用遍历。
> 机制:串行和并行两种,串行使用于单线程,单cpu;并行使用于多线程,多核cpu。

调优:
>使用调优:尽早将不用的对象赋值null,而不是等到退出生命周期自动赋值;少用finalize(),会增大GC工作量;当程序等待时,手动执行system.gc();
>虚拟机优化选项:网上查询
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: