美文网首页
垃圾回收机制与jvm结构

垃圾回收机制与jvm结构

作者: 唐小鹏 | 来源:发表于2021-03-24 10:20 被阅读0次

    熟悉Android开发的都知道,我们是不需要去处理内存分配和回收的,都由JVM处理,而垃圾回收机制(GC)就是用来帮助我们回收内存的。JVM内存结构主要包括(方法区.堆,程序计数器,栈)
    1.方法区包括(类结构信息(版本、字段、方法、接口)、常量、静态变量、还有及时编译后的代码),各线程共享堆内存,频率比堆内存回收低很多,方法区无法满足内存需求时,会报OutOfMenmeryError异常
    2.(存储对象实例和数组(简单来说所有new出来的对象都存在堆内存中)),各线程共享堆内存,是JVM管理的内存中最大一块内存区域,方法区无法满足内存需求时,会报OutOfMenmeryError异常
    3.程序计数器(存放当前线程执行字节码的行号(我们的源代码不再必须根据不同平台翻译成0和1,而是间接翻译成字节码),字节码解释器工作时,是通过改变计数器的值来选取下一条字节码指令。),各线程私有内存区域,是JVM管理的内存中最小的一块内存区域
    栈(JVM栈和本地栈),JVM栈用来执行Java方法,而本地方法栈用来执行Native方法,栈是用来存储栈帧的,每当线程调用一个方法,就会产生一个栈帧,压入栈内。
    而栈帧是由局部变量表、操作数栈和帧数据区组成:栈空间不足,会报StackOverFlowError异常
    Java垃圾回收机制(GC),必须记住一规则:Stop-the-World(JVM执行GC时线程都会处于等待状态,任何GC算法都是如此)。两种经典算法确定对象是否可以被回收:引用计数算法和可达性分析算法。
    引用计数算法,根据对象被引用的数量来判断对象是否可以被回收,详细描述:这是垃圾收集器早期的一种策略,堆中每个对象实例都有一个引用计数器。对象A,当它的引用赋值给一个变量(如a = A,b = a),则引用计数器+1;当A的引用变量生命周期结束或者设置一个新值(如a = B),那么引用计数器-1。特殊情况:当一个对象实例被垃圾收集器回收,该对象引用的任何实例的引用计数器都-1。
    可达性分析算法,根据对象引用链是否可达来判断对象是否可以被回收。
    详细描述:程序把所有的引用关系看做一张拓扑图,通过一系列的"GC Roots"作为起点,这些节点向下索引,搜索所走过的路径称为引用链,当一个对象没有任何引用链到达"GC Roots",那么这个对象不可达,可以被回收。
    关于四种引用对GC的影响
    强引用(FinalReference):任何时候时候都不会被回收,正常创建对象都是强引用。
    软应用:内存不够的时候会被回收,如果回收后还不足,则报OOM,常用于缓存一些比较占内存的资源,比如图片缓存。
    弱引用:GC扫描到的时候会被回收.GC遇到了就会回收,可以用来解决内存泄漏问题(子线程、静态方法中、枚举中)
    虚引用:随时可能被回收,无法通过虚引用获取对象值,它的get方法永远返回null。如果一个对象仅持有虚引用,那么这个对象任何时候都可以被回收。

    相关文章

      网友评论

          本文标题:垃圾回收机制与jvm结构

          本文链接:https://www.haomeiwen.com/subject/lznfhltx.html