JVM之---GC内存分配

来源:互联网 发布:下载神圣计划软件 编辑:程序博客网 时间:2024/05/16 12:36

一、基础知识

1.根搜索算法(GC Roots Tracing)

可作为GC roots的对象:

(1)栈帧中局部变量表中引用的对象

(2)方法区中类静态变量引用的对象

(3)方法区中常量引用的对象

(4)JNI引用的对象

2.引用

分为:

(1)强引用

Object obj = new Object();只要强引用存在,永远不会被回收

(2)软引用

还有用,但并非必须的对象,在系统将要发生内存溢出异常之前回收

(3)弱引用

只能生存到下一次GC之前

(4)虚引用

无法取得对象实例

3.垃圾收集算法

(1)Eden,两个Survivor使用复制算法(copying)

HotSpot默认Eden和其中一块Survivor比例是8:1。每次使用Eden和其中一块Survivor,回收时,将这两个区存活的对象一次性拷贝到另一个survivor区中,然后清除这两个区的空间。当第二块survivor空间不够时,将对象通过分配担保机制进入老年代

(2)老年代使用标记-整理算法(mark-compact)

首先标记需要回收的对象,标记完成后统一回收,注意是统一。然后将对象向前移动,清除端边界以外的内存。

(3)标记-清除算法(mark-sweep)

现在CMS使用的算法


二、垃圾回收

1.垃圾收集器

1.1 Serial收集器

(1)单线程收集器,Client模式默认新生代收集器

(2)工作时必须暂停其他所有工作线程

优点:单个CPU情况下简单高效,专注于做垃圾收集而没有其他线程开销

缺点:不说了

1.2 ParNew收集器

(1)Serial收集器的多线程版本,Server模式下首选

(2)唯一能和老年代CMS收集器交互的收集器

(3)多CPU首选

1.3 CMS收集器

(1)并发执行

(2)标记-清除算法,碎片较多。往往被迫提前进行Full GC

1.4 G1收集器

标记-整理算法,JDK 1.6开始有


2.内存分配回收策略

2.1 对象优先在Eden区分配

当Eden没有足够空间时发起Minor GC

2.2 大对象直接进入老年代

很长的字符串和数组

2.3 长期存活的对象直接进入老年代

JVM给每个对象一个年龄计数器,在Survivor区每经过一次Minor GC存活就增加一岁,默认15岁晋级到老年代

原创粉丝点击