Hotspot JVM模型中主要分三个部分:Young,Tenured,Perm
Young分成Eden和两个Survior.在Eden区进行对象的分配,当Eden满了以后,进行Young的垃圾回收,
将Eden区存活的对象和一个Survior存活的对象复制拷贝到另外一个Survior,所以有一个Survior在一个
时间点上面肯定是空的,这里使用复制拷贝的算法非常的快,因为大多数的对象都死亡了,而且复制算法是
没有碎片产生的,当对象进行了两次的垃圾回收后还存活的话,就进入Tenured.
进入Tenured代的都是存活比较久的对象,此时进行复制算法的代价是非常的高的,所以这里使用标记清除(
mark-sweep)算法或者使用标记压缩(mark-sweep-compact)算法,标记清除算法首先进行活跃对象
的标记,这样做代价还是比较大的,而后内存碎片会比较的多,有可能由于碎片的原因,大对象不能被分配,
使得outofmemory,标记压缩算法是标记完进行压缩碎片.
垃圾回收器分三种
串行(Serial),并行(parallel),并发(conccurent)三种收集器,前面两种可以使用Tenured的两种算法,并发收集器
只能使用标记清除算法
并行收集器只会压缩他认为需要压缩的区块而不会进行全区块的压缩,这个可能已经说明碎片已经过多了
并行收集器适合吞吐量优先应用,并发的则适合交互式的应用.
在young代的进行垃圾收集是会暂停其它线程的,在tenured的收集并行收集器是多线程并行进行收集,还是会暂停其它线程,
而并发收集器则是应用线程和回收线程是同时进行工作,但是需要进行两次短暂的暂停,一次是寻找标记的根对象,一次是标记完以后
再一次进行标记并发过程中漏掉的对象,暂停时间是大大的减少啊.