欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java面试之jvm垃圾回收机制 博客分类: java面试总结 jvm垃圾回收机制gc面试java

程序员文章站 2024-02-05 16:20:04
...

在我工作第四个年头的时候, 因为各种原因(薪水低和薪水低。。。)不得不离开自己工作了近三年的公司,走上面试的征程,这一次的面试和三年前的面试改变了不少, 每次面试都会提到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堆空间地址,更有利于大的, 年龄老的对象申请内存

 

 

以上是个人的理解, 还望指教!