垃圾收集器与内存分配策略

来源:互联网 发布:阿里云域名解析没生效 编辑:程序博客网 时间:2024/05/29 13:59

知识点:

1.垃圾回收的主要区域是哪个区域?

2.判断对象已死的算法?

3.有哪些垃圾收集算法?

4.有哪些垃圾收集器?

5.内存分配与回收策略。


1.垃圾回收的主要区域是哪个区域?

垃圾回收的主要区域是Java堆和方法区,因为程序计数器,虚拟机栈,本机方法栈随线程而生随线程而灭,这几个区域的内存分配 和回收都具备确定性,方法结束或者线程结束,内存自然就跟着回收了,这几个区域不过多考虑。Java堆和方法区则不一样,他们是运行期间动态创建的。主要是回收堆中内存,方法区中主要回收废弃常量和无用的类。


2.判断对象已死的算法?

a.引用计数法,一个计数器来实时计算对象引用的数量,一个地方引用就加一,失效就减一。Java虚拟机没有使用这个算法,因为他解决不了互相引用的问题。

b.可达性分析算法:

先找到“GC Roots”,当一个对象与GC Roots没有任何引用链相连,就证明对象不可用。

可作用GC Roots的对象包括以下几种:虚拟机栈,本地方法栈,方法区中类静态属性和常量所引用的对象。


3.有哪些垃圾收集算法?

a.标记清除算法

b.复制算法

c,标记整理算法

d,分代收集算法(目前Java虚拟机采用的算法),新生代,每次收集都有大批对象死去,选用复制算法,老年代对象存活率高,用标记清除和标记整理算法。


4.有哪些垃圾收集器?

a.Serial收集器,单线程,年轻代收集器

b.ParNew收集器,多线程,年轻代收集器,可与CMS收集器配合工作。

c.Parallel Scavenge收集器,多线程,年轻代收集器,可控制吞吐量

d.Serial Old收集器,单线程,老年代收集器i

e.Parallel Old收集器,多线程,老年代收集器

f.CMS, 多线程,并发,老年代收集器,标记清除算法实现

h,G1,多线程,并发,年轻代,老年代收集器,当今最牛逼的收集器。


5.内存分配与回收策略。

a. 对象主要分配在新生代的Eden区。

b.大对象直接进入老年代,避免在Eden区和两个Survivor区之间发生大量的内存复制。

c.长期存活的对象进入老年代,对象年龄达到一定值有进入老年代,一次MinorGC加一次。

d.动态对象年龄判定,如果Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代。

e.空间分配担保,Minor GC之前,如果老年代连续空间大于新生代所有对象的总空间,直接可以进行Minor GC,如果小于则查看是否允许担保(HandlePromotionFailure),如果允许,则查看老年代的连续空间是否大于以前晋升到老年代对象的平均大小,如果大于则可以Minor GC。其他情况直接进行Full GC。

原创粉丝点击