一:如何确定哪些对象应该被回收。
   1、引用记数法。在对象中添加一个引用计数器,每当有一个地方引用它时,计数器加一,引用失效时,计数器减一,当计数器为0时,该对象是不可用的。
      i:缺陷:会产生循环引用问题。
   2、可达性分析算法。算法通过一系列的称为“GC Roots” 的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots 没有任何引用链时,则该对象是不可用的。
      i:可作为GC Roots 的对象:虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。
二:如何回收垃圾。
   1、标记-清除算法。先标记出所有需要回收的对象,然后统一回收。
      i:优点,基础,简单。
      ii:缺点:效率不高,而且标记清除后会产生大量不连续的内存碎片。
   2、复制算法。该算法将可用的内存分为大小相等的两块,每次只使用一块,当这块内存使用完了,就将存活的对象复制到另一块内存,然后将这块内存全部清理。
      i:优点:不用考虑内存连续的问题。
      ii:缺点:对象存活率高时,效率低。 比较浪费内存。
   3、标记-整理算法。它是标记清除算法的改进,它不仅会清除垃圾对象,而且会进行内存的整理,这样就不会产生内存碎片了。
   4、分代收集算法。上面的几种算法各有优点,所以分代算法的目的是整合上面的算法,以提高垃圾回收的效率。在分代算法中,它根据对象存活周期的不同,将Java堆分成了新生代和老年代,各个年代
                用以最适当的收集算法。在新生代中,每次都有大量的对象死去,就采用复制算法,只需要将少量存活的对象复制即可,也正是因为每次只有少量对象存活这个特性,在复制算法中,
                   也就没有必要将内存五五开,而是一块名为的Eden区域,和两块名为survivor的区域。老年代由于存活率高,可以使用标记清除或标记整理算法。

三:垃圾回收的实现。

  1、OopMap:虚拟机是以可达性分析算法来判断哪些对象需要回收的,所以就需要先找到GC Root,有两种查找 GC Roots 的方法:一种是遍历方法区和栈区查找(保守式 GC)。一种是通过 OopMap 数据结构来记录 GC R o                 ots 的位置(准确式 GC)。很明显,保守式 GC 的成本太高。准确式 GC 的优点就是能够让虚拟机快速定位到 GC Roots。(OopMap 是一种记录GC Roots 的数据结构)

  2、安全点:

    i:概念:程序运行过程中,使OopMap内容变化的指令非常多,所以没有必要对每条指令都生成对应的OopMap,虚拟机选择在某些特定的位置来记录这些信息,这些位置就是安全点。只有在安全点才能触发垃圾回收。

    ii:Stop-The-World:在执行 GC 操作时,所有的工作线程必须停顿。因为可达性分析算法必须是在一个确保一致性的内存快照中进行。如果在分析的过程中对象引用关系还在不断变化,分析结果的准确性就不能保证。

    iii:如何选取安全点:1、循环的末尾。2、方法临返回前。3、调用方法之后。4、抛异常的位置。

    iv:为什么选这些位置:主要的目的就是避免程序长时间无法进入 Safe Point。

    v:如何在 GC 发生时,所有线程都跑到最近的 Safe Point 上再停下来?VM 采取的就是主动式中断:在 GC 发生时,不直接操作线程中断,而是简单地设置一个标志,让各个线程执行时主动轮询这个标志,发现中断标志                                为真时就自己中断挂起。轮询标志的地方和安全点是重合的。

  3、安全区:Safe Point 是对正在执行的线程设定的。如果一个线程处于 Sleep 或中断状态,它就不能响应 JVM 的中断请求,再运行到 Safe Point 上。因此 JVM 引入了 Safe Region。Safe Region 是指在一段代码片段中,引用           系不会发生变化。在这个区域内的任意地方开始 GC 都是安全的。线程在进入 Safe Region 的时候先标记自己已进入了 Safe Region,等到被唤醒时准备离开 Safe Region 时,先检查能否离开,如果 GC 完成了,那           么线程可以离开,否则它必须等待直到收到安全离开的信号为止。

四:垃圾回收器。

  暂缓。

Java垃圾回收。的更多相关文章

  1. 【转载】Java垃圾回收机制

    原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...

  2. 【转】深入理解 Java 垃圾回收机制

    深入理解 Java 垃圾回收机制   一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  3. 深入理解java垃圾回收机制

    深入理解java垃圾回收机制---- 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...

  4. Java GC系列(2):Java垃圾回收是如何工作的?

    本文由 ImportNew - 伍翀 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 本教程是为了理解基本的Java垃圾回收以及它是如何 ...

  5. Java GC系列(1):Java垃圾回收简介

    本文由 ImportNew - 好好先生 翻译自 javapapers. Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Ja ...

  6. Java垃圾回收介绍(译)

    在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的.与C语言不同的是,在Java中开发者不需要专门为垃圾回收写代码.这是使Java流行的众多特征之一,也帮助了程序员写出了更好的 ...

  7. [牛感悟系列]JAVA(1)理解JAVA垃圾回收

    理解JAVA垃圾回收的好处是什么?满足求知欲是一方面,编写更好的JAVA应用是另外一方面. 如果一个人对垃圾回收过程感兴趣,那表明他在应用程序开发领域有相当程度的经验.如果一个人在思考如何选择正确的垃 ...

  8. [译]GC专家系列2:Java 垃圾回收的监控

    原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是"成为GC专家系 ...

  9. java 垃圾回收(堆内存)、以及栈内存的释放

    一.Java的垃圾回收机制———解疑 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间. 需要注意的是:垃圾回收回收的是无任何引用的 ...

  10. Java垃圾回收机制_(转载)

    Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来.在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给 ...

随机推荐

  1. Mysql—主从复制

    https://www.jb51.net/article/137925.htm https://blog.51cto.com/13706760/2171361 https://www.cnblogs. ...

  2. fiddler---Fiddler接口测试

    前面介绍了Fiddler一些简单的使用功能,Fiddler不仅可以抓包也可以做接口工具使用,在没有接口文档的时候我们也可以通过Fiddler查看接口具体有哪些内容 Fiddler发送请求 在Fiddl ...

  3. Vue项目开发前的准备工作,node的安装,vue-cli的安装

    一.安装node 1-  点击这里进入node官网下载 2- 3- 下载完成是这样的 4-  双击打开进行安装,一路next,安装完成是这样 5-  打开cmd进入安装node的文件夹,输入node ...

  4. Pwnable-mistake

    先看看c的源码 #include <stdio.h> #include <fcntl.h> #define PW_LEN 10 #define XORKEY 1 void xo ...

  5. Spring Boot 自定义Intercepter

    在 SpringBoot2.X 中 ,WebMvcConfigurerAdapter 被deprecated , 更好的做法是 implements WebMvcConfigurer 一.自定义拦截器 ...

  6. 读取本地文件转化成MultipartFile

    介绍 现在有个上传文件功能,需要将文件上传到oss上,但是文件有点多,于是使用接口进行上传.但是需要上传文件转换为MultipartFile类型文件进行上传. 主要代码 添加pom文件 <dep ...

  7. O2O 线下业务 和 线上业务,在特征工程上的差异

    人工智能在外卖送达时预估上的应用 这篇讲清楚了 O2O 线下业务 和 线上业务,在特征工程上的差异:

  8. CF1256A Payment Without Change

    CF1256A Payment Without Change 洛谷评测传送门 题目描述 You have aa coins of value nn and bb coins of value 11 . ...

  9. 调试九法: 软硬件错误的排查之道 (David J. Agans 著)

    第1章 简介 (已看) 第2章 总体规则 (已看) 第3章 理解系统 (已看) 第4章 制造失败 第5章 不要想, 而要看 第6章 分而治之 第7章 一次只改一个地方 第8章 保持审计跟踪 第9章 检 ...

  10. 【shell脚本】检查内存使用情况===chenkMen.sh

    检查内存使用情况,当内存可使用等于100时,释放缓存 [root@localhost thy]# cat checkMem.sh #!/bin/bash #防止内存溢出问题 used=`free -m ...