zoukankan      html  css  js  c++  java
  • Java虚拟机 垃圾收集器与内存分配策略

    说起GC,我们要思考的主要有三件事

    哪些内存需要回收

    那些已经“死去”的对象,那么哪些对象“死”,哪些对象“活”呢,有个简单的办法

    引用计数法,但是没法解决循环依赖问题

    所以Java虚拟机采用的是可达性分析算法

    这个算法通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,如果对象无法被搜到,那么这些对象会被标记为要清除的对象。

    那么“GC Roots”又是什么?“GC Roots”主要有以下几种

    活跃栈帧中的指向GC堆的引用,就是方法运行时的临时变量,引用参数

    被加载的Java类

    Java类中的引用类型静态变量

    等等

    什么时候回收

    谈什么时候回收还得从minor gc和major gc(full gc)讲起,minor gc指新生代回收,major gc指老年代回收

    先来讲新生代回收的原因,新生代内存区域分为eden区和两个survivor区(hotspot默认为eden:survivor=8:1)当eden要满了了,就进行一次minor gc

    再来讲讲老年代回收的原因,新生代升到老年代的区域满了,就会发生major gc

    那么如果gc后还是满了呢?那就OutOfMemoryError

    如何回收

    对于新生代和老年代有不同的回收策略

    新生代:新生代对象来的快去的也快,所以采用“标记复制算法”,eden区存活内容复制到survivor1区,然后清空eden区,然后当survivor1区要清理就升入survivor2区,最后升入老年代

    老年代:老年代对象存活时间长,所以采用“标记清除算法”。

  • 相关阅读:
    UVA 12467
    UVA 12604
    部署ASP.NET MVC项目
    以路由控制URL
    Week13(12月2日):又到了那个点,期末了~~~~
    购物网站讨论5:会员功能的实现
    购物网站讨论4:订单结账功能实现
    购物网站讨论3:购物车功能实现
    购物网站讨论2:商品浏览功能实现
    购物网站讨论1:关于模型那些事
  • 原文地址:https://www.cnblogs.com/shineyoung/p/10518380.html
Copyright © 2011-2022 走看看