★引用计数收集器

这种方法中,堆中每个对象都有一个引用计数。当一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被设置成1。当这个对象的引用赋值给其他任何一个变量的时候,这个变量就增加1。当该对象引用超过生存期或者被设置成一个新的值时,相应的计数变量就会减1。当引用计数为0的时候,这个对象就被当做垃圾收集。在收集的时候,该对象所引用的任何其他对象的计数值也相应的减少1。这种方法中,某个对象被垃圾收集后可能导致后续其他对象的垃圾收集行动。

好处:可以很快的执行,交织在程序的运行之中。对于实时环境很有利。

坏处:无法检测出循环(即两个或者更多的对象相互的引用)。for example:父对象有个对子对象的引用,子对象又反过来引用父对象。另外就是计数的的增加和减少会带来额外的开销。

★跟踪收集器

跟踪收集器追踪从根结点开始的对象引用图。在java虚拟机之垃圾收集(上)中也说到过,跟踪收集,以某种方式来标记。追踪算法被称作“标记并清除”。

1.在标记阶段,垃圾收集器遍历引用树,标记每个遇到的对象

2.在清除阶段,没有被标记的对象被释放,使用的内存被返回到正在执行的程序。在java虚拟机中,清除步骤必须包括对象的终结。

★压缩收集器

该收集器即压缩和拷贝,是标记并清除收集器通常使用的两种策略,也是java虚拟机垃圾收集器中对付堆碎块的策略。这两种方法都是快速的移动对象来减少堆碎块。

压缩收集器把活动的对象越过空闲区滑动到堆的一端,在这个过程中,堆的另一端出现大的连续空闲区。所有被移动的对象的引用也被更新,指向新的位置。被移动对象引用的更新可以间接实现比较简单。不直接引用堆中的对象,实际上指向一个对象句柄表。对象句柄才指向堆中对象的实际位置。对象移动的时候,只有这个句柄需要被更新成为新位置。所有的程序中对对象的引用仍然指向这个具有新值的句柄,句柄的本身没有移动。这种做法也会对象的每次访问带来性能的损失。

★拷贝收集器

拷贝收集器把所有的活动的对象移动到一个新的区域。在拷贝过程中,被紧挨着布置,这样可以消除原本它们在旧区域的空隙。即空闲区。

好处:对象可以在根对象开始的遍历过程中随着发现而拷贝,不再有标记和清除的区分。对象被快速拷贝到新区域,同时转向指针仍然留在原来的位置。转向指针可以让垃圾收集器发现已经被转移对象的引用。然后垃圾收集器可以把这些引用设置为转向指针的值,因此它们现在指向对象的新的位置。

一般的拷贝收集器算法被成为“停止并拷贝”。此方案中,堆被分成两个区域,任何时候都使用一个区域。对象在同一个区域中分配直到被耗尽。此时,程序执行被中止,堆被遍历,遍历时遇到活动的对象被拷贝到另个区域。当停止和拷贝过程结束时,程序恢复执行。依次往复,对于指定大小的堆来说需要两倍大小的内存,由于任何时候都只使用其中的一半,这就是该方法带来的代价。

★按代收集的收集器

针对停止并拷贝收集器的缺点的改进:

1.大多数程序创建的大小大部分对象都具有很短的生命期

2.大多数程序都创建一些具有非常长生命周期的对象

按代收集的收集器通过把对象按照寿命来分组。此方法中,堆被划分成两个或者更多的子堆,每个堆为一“代”对象服务。最年幼的那一代进行最频繁的垃圾收集。最年幼的对象在经历了好几次的收集后仍然存活,那么它就成长为寿命更高的一代,会被转移到另外一个子堆中去。即更高的年龄层去。

按代收集技术可以应用于拷贝算法,也可以应用于标记并清除算法。可以提高垃圾收集算法的性能。

★自适应收集器

自适应收集器主要是根据具体的情况和为了实现更好的目的,采用多种不同的算法来实现垃圾收集。即组合收集器,多种收集器技术的结合使用。

在编程中寻找快乐,在快乐中自由编程!!!

java虚拟机学习笔记之垃圾收集(下)相关推荐

  1. java虚拟机学习笔记之垃圾收集(上)

    java程序是运行在java虚拟机当中的,在java虚拟机的堆中运行着程序所创建的对象.可以使用new,newarray,anewarray,multianewarray指令来创建对象,但是没有明确的 ...

  2. Java 虚拟机学习笔记 | 类加载过程和对象的创建流程

    前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...

  3. 【深入理解Java虚拟机学习笔记】第三章 垃圾收集器与内存分配策略

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  4. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  5. 深入理解 Java 虚拟机 学习笔记

    第二章 Java 内存区域与内存溢出异常 内存区域 -- from 姜志明 对象创建 加载类 若已经在内存中则跳过. 类加载完以后就可以确定对象所需的空间大小 // TODO why? 分配内存 根据 ...

  6. 深入理解JAVA虚拟机学习笔记(一)JVM内存模型

    摘要:   上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状 ...

  7. Java 虚拟机学习笔记 | 运行时数据区总结

    前言 要想学习好 Java,Java虚拟(JVM)的学习是绕不开的.学习 Java虚拟(JVM)首先就要先了解的就是Java虚拟(JVM)运行时数据区. 在Java语言和虚拟机规范中对运行时数据区进行 ...

  8. java 准备 解析_深入理解JAVA虚拟机学习笔记24——类加载的准备和解析

    每天进步一点点! 今天我们一起看一下类加载的准备阶段和解析阶段. 先看一下准备阶段:主要任务是在方法区中为类变量(仅static修饰变量,不包含实例变量)分配内存并设置类变量初始化的阶段. 这里面的区 ...

  9. Java虚拟机学习笔记(一)—Java虚拟机概述

    一:编程语言兼容底层系统的方式大概分为两种 1.通过编译器实现兼容 例如C.C++等编程语言,既能运行与Linux系统,也能运行与Windows系统:既能运行于x86平台,也能运行于AMD平台.这种能 ...

最新文章

  1. Mysql 解决1251- Client does not support authentication protocol requested by server...的问题
  2. Qt警告提示:找不到“stddef.h”头文件,操蛋得很~~~
  3. C++STL的map/ multimap容器
  4. tf.gather( )的详细解析
  5. Product ID Not in valid range
  6. 虚拟主机php.ini在哪里,虚拟主机的php.ini配置文件在哪里
  7. ubuntu使用ssh登入不执行.bashrc解决方法
  8. 二叉树层级打印(分层次和不分层次)
  9. 怎么做性能测试--响应时间
  10. VCS学习(2)debug simulation mismatches
  11. 安防监控项目动辄几十亿,什么样的监控系统才能胜任?
  12. 深度学习之训练误差和泛化误差
  13. 微信订阅号和公众号的区别
  14. burpsuite之CSRF测试
  15. Tensorflow神经网络框架 小例子 三层神经网络 卷积神经网络 循环神经网络 神经网络可视化
  16. 帝国CMSH5小游戏模板帝国CMS内核游戏整站源码
  17. linux shell tr命令,linux shell tr命令详解
  18. matlab打开笔记本摄像头_如何利用MATLAB实现摄像头视频获取和保存
  19. matlab和ccd相机通讯,串口通讯在CCD相机系统中的应用
  20. 基于J2EE的科研项目管理系统设计与实现

热门文章

  1. qt的四舍五入_string.format 小数点 QT 对于float类型四舍五入
  2. [WP/CTFshow]XSS Web316-333
  3. Pytorch的自定义拓展:torch.nn.Module和torch.autograd.Function
  4. 卷积神经网络中Attention注意力机制(CBAM)
  5. Go之Go语言是什么?Go有什么特点?Go语言的应用前景如何?
  6. SQL的左连接 ,右连接,内连接和全外连接的4者区别
  7. Fiddler 抓包工具“测试人员”高频使用方法
  8. FAST-LIO2代码解析(二)
  9. 模仿是学习的最佳途径
  10. Matlab的D算法