java - jvm 年轻代 如何回收 survivor 对象
问题描述
1.jvm年轻代内存回收 Eden:survivor=8:1
2.采用复制算法 Eden区满后标记后将存活对象房子survivor0里 如下图:
下一次Eden 满了 会将对象放到之前清空的 survivor1的区域里
问:
1.survivor的对象如何被清理 同样是标记-清除/整理算法嘛?
2.对象从年轻代到老年代是经过每次gc时候 还是动态的进入,当达到某一条件晋升?什么条件
问题解答
回答1:lz你好,之前看到你在我的文章浅析JVM之内存管理下评论了,同时也看到了你的问题。我的文章里面都有提到:
survivor区属于年轻代,用的是复制收集算法
经过数次(默认是15次)在两个Survivor区域移动后还存活的对象最后会被移动到老年代
特别大的对象直接进入老年代
回答2:推荐看看《深入理解java虚拟机》。
1.新生代的GC算法几乎都是复制算法,也就是说,survivor也是被复制到老年代中去的。2.对象从新生代到老年代,有几种情况
2.1有一个年龄参数MaxTenuringThreshold用来判断,每次对象熬过一次GC,年龄加1,当到达设定的阈值时,可以进入老年代。2.2比较大的对象(需要大量连续的内存空间),同样,虚拟机也提供了一个参数PretenureSizeThreshold,可以设置这个值,当对象大于设置值可以直接进入老年代。2.3如果Survivor空间中相同年龄的对象大小总和大于Survivor空间的一般,则年龄大于或等于该年龄的对象就可以进入老年代。这里是属于动态判定,适应那些内存较小的情况
还有一些其他情况,可以看看书
相关文章:
1. angular.js - angularjs 使用鼠标悬停时,标签一直闪2. c++ - win764位环境下,我用GCC为什么指针占8个字节,而long是4个字节?3. html5 - HTML代码中的文字乱码是怎么回事?4. 一个走错路的23岁傻小子的提问5. node.js - 函数getByName()中如何使得co执行完后才return6. java - 安卓电视盒子取得了root权限但是不能安装第三方应用,请问该怎么办?7. android - 安卓activity无法填充屏幕8. python 计算两个时间相差的分钟数,超过一天时计算不对9. javascript - SuperSlide.js火狐不兼容怎么回事呢10. python - django 里自定义的 login 方法,如何使用 login_required()
