在我工作第四个年头的时候, 因为各种原因(薪水低和薪水低。。。)不得不离开自己工作了近三年的公司,走上面试的征程,这一次的面试和三年前的面试改变了不少, 每次面试都会提到jvm的垃圾回收机制!
jvm的内存结构 分为 heap堆 stack栈 和方法区method area
这里讲一下jvm的heap堆的垃圾收集算法
jvm将堆内存分为 新生代 和老年代(就是所谓的分带的垃圾回收) ,在heap新生代中又分为eden 和survivor1 和survivor2
垃圾收集算法分为:
1,标记-清除 算法;
2,标记-复制算法;
3,标记-整理算法;
分带的垃圾回收机制:
新生代:
在对象创建时, Object obj = new Object(); obj 对象的引用将存放早方法区 method area , 真正的对象则存放在 heap堆 eden的中, 当在必要的条件下 jvm 发生gc时, jvm会根据 对象的引用计数器 或者 对象的可达性 进行判断, 使用标记-复制算法(使用于heap堆的新生代)对 eden中的存活对象进行标记 、年龄+1 然后将标记的存活对象 copy到 heap堆的survivor1 将eden清空, 当survivor1 发生gc 同样的进行标记复制存活对象 到 survivor2 然后 survivor1 清空, 交替, 新生代的对象很多, 就会将年龄大的存活对象 放到 老年代中
老年代:
当heap堆老年代jvm发生gc, 则会使用 标记整理算法, 堆存活的对象进行标记, 然后将对象进行整理,以免出现存储碎片, 导致大对象申请不到内存
在新生代中和老年代采用不同的垃圾回收算法, 因为新生代中的对象基本上创建之后 就会死亡, 存活率很低, 因此使用标记复制算法, 将少量的留下来的对象copy到另外一块地方, 然后清空存储区域;
而在老年代中 绝大部分的对象都是存活的, 因此使用标记整理的算法 将死掉对象 清除, 然后整理存储空间, 释放出连续的heap堆空间地址,更有利于大的, 年龄老的对象申请内存
以上是个人的理解, 还望指教!