GC
JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代~
新生代GC(minor GC):
指发生在新生代的垃圾回收动作,因为Java对象大多都具备朝生夕灭的特点,所以minor GC发生得非常频繁,一般回收速度也比较块。
老年代GC(Major GC/Full GC):
指发生在老年代的GC,它的速度会比minor GC慢很多。
GC两种类:轻GC(普通的GC),重GC(全局GC)
引用计数法
针对堆中的对象,给每一个对象分配一个计数器(计数器本身有消耗),当对象被使用一次计数器就+1,被使用次数为0的对象就被删除掉了
复制算法
为什么幸存0区、幸存1区的位置始终在交替轮换,这就是复制算法在驱动(因为动态地缘故,在幸存区分区中,相对空的一区叫做“To区”,相对满的一区叫做“From区”)
伊甸园区GC过后还存在的对象进入到幸存区。下一次GC,在幸存区中,垃圾会有一个“向空区转移”的趋势,垃圾会被分到相对干净的一个分区中,并且之前的存在于其他分区的垃圾也会进入该分区。达到一个“清空幸存区部分分区”的效果,从而就驱使了幸存区中分区的动态轮换。实现的过程就是复制算法的体现,即原先存在垃圾的分区复制到了空的分区,从而让本身变成了空的分区(From -To empty),动态往复…
好处:没有内存的碎片~
坏处:浪费了内存空间~:多了一半空间永远是空to。假设对象100%存活(极端情况)
复制算法最佳使用场景:对象存活度较低的时候;新生区~
标记-清除-压缩算法
扫描对象,对存活的对象进行标记,清除没有标记的对象(标记-清除算法),为了减少内存碎片的产生,在(标记-清除算法)的基础上进行内存空间压缩,这被称之为(标记-压缩算法)
为了提高效率,减少压缩的次数,通常在几次GC过后进行一次压缩
优化没有尽头~
总结
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清除算法
内存利用率:标记压缩算法=标记清除算法>复制算法
GC题目:
. JVM的内存模型和分区~详细到每个区放什么?
·堆里面的分区有哪些? Eden,form,to,老年区,说说他们的特点!
·GC的算法有哪些?标记清除法,标记压缩,复制算法,引用计数器,怎么用的?
·轻GC和重GC分别在什么时候发生?