美文网首页
关于JVM运行时数据分区和GcRoot,垃圾回收的算法

关于JVM运行时数据分区和GcRoot,垃圾回收的算法

作者: 浩仔_Boy | 来源:发表于2021-01-20 15:26 被阅读0次

    自己学习总结,仅供自己参考,如有不对欢迎指正

    一、JVM运行时数据分区

    主要分为方法区虚拟机栈本地方法栈程序计数器5个部分
    堆和方法区是线程共享,虚拟机栈、本地方法栈、程序计数器是属于线程私有


    • 新生代老年代,比例是1:2;新生代分为Eden、from、to三个区域,并且内存比例为8:1:1(采用此比例主要原因是,新生代大部分内存都是短暂存活的,防止内存浪费)
    • 方法区
      常量池。存放类信息、静态变量、静态常量、常量、运行时常量等
    • 程序计数器
      当前线程正在执行的字节码行号指示器,每次只会存储一个数据,是唯一不会内存溢出的区域
    • 虚拟机栈
      存放栈帧,一个栈帧对应线程的一个方法。栈帧又分为局部变量表操作数据栈动态链接方法出口
      递归有可能造成栈空间不足,抛出stack over flow error的错误。
    • 本地方法区
      用来记录线程要执行的本地方法

    二、GcRoot,垃圾回收的算法

    第一步:确定垃圾

    • 引用计数法
      简单理解,对象被引用一次,计数器+1,当计数器为0,则视为垃圾

    • 可达行分析法
      GcRoot与对象之间没有可达的路径,并被至少标记过两次,则视为垃圾

    第二步:垃圾回收算法

    • 标记清除算法
      实现原理是,对所有要被清除的对象进行标记,标记完成后统一回收
      缺点:
      (1)效率低
      (2)造成大量不连续的内存。导致可用空间降低,频繁GC

    • 复制算法
      实现原理是,将内存容量分成已使用和未使用两块,当一块内存满了,会复制起存活的对象到一块新的内存上,并将该内存对象清理掉。
      优点,效率高;缺点:内存被压缩了一半

    • 标记整理法
      实现原理是,标记阶段与标记清除算法相同,标记后将存活的对象移到一侧,清除另一侧的对象

    • 分代收集算法
      是上面三种算法的结合。jvm运行时堆内存会分为两种,新生代和老年代。
      新生代,标记复制算法(老年代大部分内存都是短暂存活的)
      老年代, 标记整理算法(老年代每次只会有少量内存被回收)

    参考链接1:https://www.bilibili.com/video/BV1y4411P7C2?from=search&seid=98352672442840858
    参考链接2:https://zhuanlan.zhihu.com/p/144930844
    参考链接3:https://www.cnblogs.com/newAndHui/p/13112066.html

    相关文章

      网友评论

          本文标题:关于JVM运行时数据分区和GcRoot,垃圾回收的算法

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