美文网首页
Java 虚拟机之内存分配垃圾收集

Java 虚拟机之内存分配垃圾收集

作者: baoyinlei | 来源:发表于2019-10-08 22:34 被阅读0次
运行数据区
GC Roots
  1. 虚拟机栈中引用的变量(本地变量)
  2. 方法区中类的静态属性(类的静态属性)
  3. 方法区中常量引用的对象(常量)
  4. 本地方法栈中引用的变量 (本地方法)
垃圾收集算法
  1. 标记-清除算法
    • 缺点: 标记-清除效率都不高,且内存空间容易产生碎片化,分配较大内存对象时,不得不进行垃圾收集动作
  2. 复制算法
    • 优点: 不会出现碎片化等情况,实现简单,运行搞笑
    • 缺点: 需要2倍内存,如果存活的对象较多时, 效率变低
    • 应用: 商业虚拟机用复制算法来回收新生代的内存,因为新生代的对象存活率低,因此不需要1:1分配内存,Hotspot 虚拟机分配比例为eden:survivor:survivor=8:1:1
  3. 标记-整理算法
    • 标记过程和“标记-清除”一样,但不是直接对可回收对象进行清除,而是对存活的对象向一端移动,然后清理掉其他的内存
  4. 分代收集算法
    • 描述: 根据对象存活的周期,将java堆分成新生代和老年代,根据年代的特定,采用适当的收集方法。
    • 新生代: 每次垃圾收集时,有大量的对象死去,只有少量的存活,所以采用复制算法,调节适当的比例。
    • 老年代: 对象比较稳定,存活率较高,没有多余的空间,所以比较适合用”标记-整理”或“标记-清除“算法。
Minor GC和Full GC区别
  • Minor GC:新生代GC,回收比较频繁,速度比较快
  • Full GC: 老年代GC也称为Mojor GC,回收比较慢,效率低
堆内存分为几块

堆内存分为新生代和老年代 永久代(hotspot中在方法区,元空间?)

内存分配策略
  • 对象优先分配在Eden
  • 大的对象直接进入老年代
  • 长期存活的对象 (年龄达到15)
  • 动态对象年龄判断(survivor中相同年龄的对象总和大于survivor空间一半的时候,直接进入老年代)
  • 空间分配担保 (老年代的连续空间大于新生代所有对象总和?是否担保?连续可用空间是否大于历次进入老年代的平均?否则Full GC)
垃圾收集器
  • Serial收集器 (复制算法)
    单线程完成垃圾收集工作,并且暂停其他所有的工作线程。对比其他单线程来说,简单高效,没有线程切换的开销。

  • ParNew收集器(复制算法)
    相当于多线程的Serial收集器,能和CMS配合工作

  • Parallel Scavenge收集器(复制算法)
    目的是达到一个可控制的吞吐量

  • Serial Old收集器 (标记-整理)
    Serial 老年代版本。

  • Paraller Old 收集器 (标记-整理)
    Paraller Scavenge 的老年代版本

  • CMS收集器(标记-清除)
    一种以获取最小回收停顿时间为目标的收集器。
    清理过程分为四个步骤:

    1. 初始标记
    2. 并发标记
    3. 重新标记
    4. 并发清除

    其中初始标记和重新标记停止所有工作线程。并发标记是GC Roots Tracing过程,重新标记则是为了修正并发标记期间因工作线程继续运作而导致的变动。并发清除,清除掉标记上的内存。
    三个缺点:1.对cpu资源敏感,默认回收启动的线程数为 (cpu数量+3)/4 ,当cpu数量较少时,占用cpu资源较多。2. 无法处理浮动垃圾,由于并发清理阶段工作线程还在运行,运行过程中会产生垃圾,只能等下一代GC被清理,且CMS需要预留一点空间,在并发收集时使用。3. 会产生大量碎片,由于并发-清除算法。

  • G1收集器
    优势

    • 并发与并行: 利用多线程的资源,减少停顿时间
    • 分代收集: 采用不同的方式收集新对象和旧对象
    • 空间整合: 整理上标记-整理,局部复制算法,不会产生空间碎片
    • 可预测的停顿: 可以指定时间用来收集垃圾

    不考虑Remembered Set操作,分为几个步骤

    1. 初始标记
    2. 并发标记 (耗时较长,但不需要停顿用户线程)
    3. 最终标记
    4. 筛选回收

相关文章

  • 垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 @(Java虚拟机)[垃圾收集, GC] [TOC] 对象已死吗 程序计数器,虚拟机栈,...

  • 运行时数据区域

    Java虚拟机通过内存动态分配和垃圾收集技术来帮助程序员管理内存。Java虚拟机在执行Java程序的过程中会把它所...

  • 从JVM到GC的学习脑图

    参考了《深入理解JAVA虚拟机》的第三章 垃圾收集器与内存分配策略 java对象

  • 虚拟机笔记

    1、java运行时区域 2、关于虚拟机中的引用 3、垃圾回收集算法 4、内存分配

  • java虚拟机内存结构

    Java虚拟机内存结构 时间:20170227 Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的“高...

  • 深入理解Java虚拟机(二)之四种引用

    深入理解Java虚拟机系列文章 深入理解Java虚拟机(一)之内存模型 深入理解Java虚拟机(三)之垃圾收集 深...

  • 垃圾收集器

    垃圾收集器如何判断内存是否需要回收 java的内存分配有:程序计数器、虚拟机栈、本地方法栈、java堆、方法区其中...

  • Java虚拟机 —— 垃圾回收机制

    在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中。如果在Java程序运...

  • 深入理解java虚拟机总览

    一.自动内存管理机制 1.java内存区域与内存溢出异常 2.垃圾收集器与内存分配策略 3.虚拟机性能监控与故障处...

  • 《深入理解Java虚拟机》总纲

    第2章 Java内存区域与内存溢出异常 第3章 垃圾收集器与内存分配策略 第4章 虚拟机性能监控与故障处理工具 第...

网友评论

      本文标题:Java 虚拟机之内存分配垃圾收集

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