垃圾回收GC(Garbage Collection)

自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。

所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用对象),则没有被任何指针给指向,因此占用的内存也可以被回收掉。

在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。

图片来源:https://mp.weixin.qq.com/s?src=11&timestamp=1586917481&ver=2279&signature=DEGXcqdntsm--t9WrnSBOqkBxn3GzmyYzz5cT0Dz6FFPXvirsLDSUGqXXjUT06qjBWWT1pyIp997O4ahPDjK-zzDKtG9sSDQ3hWUgneBxOggEBWQUdhLkE-OHQnOu0xL&new=1

第一步:标记

垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。

上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。如果系统里所有的对象都要检查,那这一步可能会相当耗时间。

第二步:清除

这一步会删掉标记出的未引用对象。

内存分配器会保留指向可用内存的引用,以供分配新对象。

第三步:压缩

为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压缩),这样就能更简单快捷地分配新对象了。

为什么需要分代垃圾收集?

之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。

来看个例子吧。(下图中,竖轴代表已分配的字节,而横轴代表程序运行时间)

上图可见,存活(没被释放)的对象随运行时间越来越少。而图中左侧的那些峰值,也表明了大部分对象其实都挺短命的。

JVM 分代

根据之前的规律,就可以用来提升 JVM 的效率了。方法是,把堆分成几个部分(就是所谓的分代),分别是新生代、老年代,以及永生代。

新对象会被分配在新生代内存。一旦新生代内存满了,就会开始对死掉的对象,进行所谓的小型垃圾回收过程。一片新生代内存里,死掉的越多,回收过程就越快;至于那些还活着的对象,此时就会老化,并最终老到进入老年代内存。

Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。在这种事件发生时,所有的程序线程都要暂停,直到事件完成(比如这里就是完成了所有回收工作)为止。

老年代用来保存长时间存活的对象。通常,设置一个阈值,当达到该年龄时,年轻代对象会被移动到老年代。最终老年代也会被回收。这个事件成为 Major GC。

Major GC 也会触发STW(Stop the World)。通常,Major GC会慢很多,因为它涉及到所有存活对象。所以,对于响应性的应用程序,应该尽量避免Major GC。还要注意,Major GC的STW的时长受老年代垃圾回收器类型的影响。

永久代包含JVM用于描述应用程序中类和方法的元数据。永久代是由JVM在运行时根据应用程序使用的类来填充的。此外,Java SE类库和方法也存储在这里。

如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收。

世代垃圾收集过程

现在你已经理解了为什么堆被分成不同的代,现在是时候看看这些空间是如何相互作用的。 后面的图片将介绍JVM中的对象分配和老化过程。

首先,将任何新对象分配给 eden 空间。 两个 survivor 空间都是空的。

当 eden 空间填满时,会触发轻微的垃圾收集。

引用的对象被移动到第一个 survivor 空间。 清除 eden 空间时,将删除未引用的对象。

在下一次Minor GC中,Eden区也会做同样的操作。删除未被引用的对象,并将被引用的对象移动到Survivor区。然而,这里,他们被移动到了第二个Survivor区(S1)。此外,第一个Survivor区(S0)中,在上一次Minor GC幸存的对象,会增加年龄,并被移动到S1中。待所有幸存对象都被移动到S1后,S0和Eden区都会被清空。注意,Survivor区中有了不同年龄的对象。

在下一次Minor GC中,会重复同样的操作。不过,这一次Survivor区会交换。被引用的对象移动到S0,。幸存的对象增加年龄。Eden区和S1被清空。

此过程演示了 promotion。 在较小的GC之后,当老化的物体达到一定的年龄阈值(在该示例中为8)时,它们从年轻一代晋升到老一代。

随着较小的GC持续发生,物体将继续被推广到老一代空间。

所以这几乎涵盖了年轻一代的整个过程。 最终,将主要对老一代进行GC,清理并最终压缩该空间。

所以这几乎涵盖了年轻一代的整个过程。 最终,将主要对老一代进行GC,清理并最终压缩该空间。

原文:

https://www.oschina.net/translate/java-gc

java的垃圾回收_java-垃圾回收机制相关推荐

  1. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

  2. java list clear 垃圾回收_java垃圾回收机制

    1.什么是垃圾回收? 程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存资源,最终将导数内存溢出,所以内存资源的管是非常重要了. 1.1.C/C++语言的垃圾回收 在C/C+ ...

  3. java 静态数组 垃圾回收_java垃圾回收

    参考文献: 1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象.该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引 ...

  4. java 内存 回收_java内存回收

    一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...

  5. java垃圾回收_Java垃圾回收机制

    垃圾回收的意义 如果不进行垃圾回收,内存迟早会被消耗空. 垃圾回收机制的引入可以有效的防止内存泄露.保证内存的有效使用,也减轻了 Java 程序员的对内存管理的工作量. 内存泄露:指该内存空间使用完毕 ...

  6. java如何保证类不被回收_Java垃圾回收机制

    大部分转自:http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用, ...

  7. java 老年代回收_Java垃圾回收之老年代垃圾收集器

    1.Serial Old 收集器(-XX: +UseSerialOldGC, 标记-整理算法) 1.1 单线程收集,进行垃圾收集时,必须暂停所有工作线程 1.2 简单高效,Client模式下默认的老年 ...

  8. java 垃圾回收手动回收_Java垃圾回收(2)

    java 垃圾回收手动回收 并行清理 今天,我们介绍了并行GC的工作原理. 具体来说,这是在Eden上运行并行Scavenge收集器,在Tenured一代上运行Parallel Mark and Sw ...

  9. java 垃圾回收手动回收_Java垃圾回收(4)

    java 垃圾回收手动回收 G1:垃圾优先 G1收集器是热点JVM中要实现的最新收集器. 自Java 7 Update 4以来,它一直是受支持的收集器.OracleGC团队也公开表示,他们对低暂停GC ...

  10. java 多线程垃圾回收_Java 垃圾回收

    Java 垃圾回收 1 什么是Java 垃圾回收 在Java中,垃圾意味着未引用的对象. 垃圾回收是自动回收运行时未使用的内存的过程.换句话说,这是销毁未使用对象的一种方法. 我们在C语言中使用fre ...

最新文章

  1. Ubuntu安装TensorFlow-gpu及cuda9.0(不给自己找麻烦)
  2. sql 存储过程学习
  3. 量子计算机新科技未来,能够“预测多个未来”的量子计算机诞生
  4. 102份深圳炒房材料曝光 网友举报千人炒房大会
  5. 今日头条成锤子“接盘侠”?“是真的!”
  6. S3C2440 进行微秒级、毫秒级延时函数
  7. ASP.NET 2.0运行原理及其过程简要分析
  8. 什么专业的会学python语言_为什么要学习Python编程语言?哪些人适合学习Python?...
  9. reg文件导入注册表后出现中文乱码的解决方法
  10. 项目经理面试必备20题
  11. 3-8 B: 分离LZY的字符串
  12. 全网最全的私网多种穿透互联技术解析
  13. DCOS(centos 7.4/7.6)
  14. dz论坛修改html编辑器,discuz插件推荐:编辑器H5上传
  15. react hook(基础详解)
  16. 字符串格式化-format()
  17. 论文阅读《API2Com: On the Improvement of Automatically Generated Code Comments Using API Documentations》
  18. oracle雾化试图_ORACLE物化视图具体解释
  19. linux界面赶不上微软,忘掉微软!其实Linux桌面也能如此美
  20. 品Spring:能工巧匠们对注解的“加持”

热门文章

  1. Excel文件删除了怎么找回?
  2. 题目名称:打印乘法口诀表
  3. 做到这6点你才算摸到了项目管理的门
  4. File类中的方法实现文件排序
  5. 定位微信小程序导航栏
  6. 微信小程序顶部导航栏
  7. 使用Java代码实现选择排序Java
  8. 扫描文件软件有哪些?
  9. 子皓/雯雯《男左女右》
  10. java汽车的风挡玻璃_汽车挡风玻璃能抛光吗 其实不需要更换玻璃的