美文网首页
关于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