Java和C++之间有一睹内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人想出来。-------《深入理解JVM虚拟机》

补充:在无用对象判断这两种方法中,都是靠对象的引用进行判断对象是否无用。又因为在某些情况下我们不一定需要回收对象,因此在jdk1.2后,java对引用进行了扩充,将引用分为4类“强引用”“软引用”“弱引用”“虚引用”。

补充2:对于方法区中的垃圾回收,回收效率远远低于堆,在此区域中主要回收的内容为:无用的类以及废弃的常量。废弃常量的回收与堆中非常类似,但是无用类的回收将麻烦许多。

补充3:四种引用类型:强引用,垃圾回收不回收被引用对象。软引用,内存溢出之前列入二次回收范围。弱引用,生存到下一次垃圾回收。虚引用,对象被收集时收到一个系统通知。

下面详细说说四种回收算法。

  • 标记-清除:分为两个阶段,首先是进行无用对象判断,进而标记出所有需要回收的对象,标记完成后进行统一的对象回收。此算法为回收算法最基础算法,但是其有两个缺点,效率不高和内存碎片太多。
  • 复制:将内存分为三个区域,一块大区域eden与两块小区域survivor,每次使用只使用eden和一块survivor,回收时将eden和survivor中存活的对象复制到未使用的survivor上,然后将之前使用过的区域清除。当survivor空间不够时,借用eden区域实施算法。
  • 标记整理:首先将标记对象,然后将标记的对象向内存一端移动,然后直接清理边界之外的区域。这种算法主要适用与对象存活时间长,存活率高的情况。
  • 分代收集:将内存分为老年代和新生代,针对老年代,采用标记整理算法或标记清除算法,针对新生代,采用复制算法。因为新生代中大部分对象存活时间短,存活率极低,如果使用标记整理算法效率不高,同时老年代中对象存活时间长,存活率高,使用复制算法极大影响效率。

对于垃圾回收,还有一个重要的概念 “安全点”,他用在无用对象判断前使所有线程停止,这个停止的地方就是安全点,然后进行无用对象判断这一过程。原因简单来说,你不能在内存还是动态的过程中进行判断某个对象是否无用。

如何让线程跑到安全点呢?

首先虚拟机设置一个中断标志,然后线程去主动轮询这个标志,让发现中断为真,将自己挂起。但是这里有一个漏洞,如果线程本身是挂起状态,那么这个线程如何知道现在是垃圾回收器工作中,自己不能运行呢?这里便又引入的安全区域的概念,意思是在这个区域中,gc可以安全进行。

下面将列出主要的垃圾收集器及其特点:

  • Serial(新生代)--Serial Old(老年代):单线程收集器,特点:简单高效。新生代采用“复制”,老年代采用“标记整理”。
  • ParNew(新生代):Serial的多线程版本,但在但CPU下,不一定效果比Serial好,其成为新生代收集器的选择一个很大原因是能与CMS收集器配合。新生代采用“复制”
  • Parallel Scavenge(新生代)--Parallel Old(老年代):吞吐量优先收集器。特点:可自适应调节回收时间,适合后台运算。
  • CMS(老年代):特点:并发收集,低停顿。
  • G1:最前沿收集器,按下不表。

目前虚拟机采用的收集器搭配方案:CMS-ParNew  Parallel Scavenge--Parallel Old  Serial Old-ParNew

深入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. HDU 3533 Escape(大逃亡)

    HDU 3533 Escape(大逃亡) /K (Java/Others)   Problem Description - 题目描述 The students of the HEU are maneu ...

  2. dao层、service和action的运用和区别

    DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,对于数据库的操作,具体到对于某个表的增删改查, 也就是说某个DAO一定是和数据库的某一张表一一对应的 ...

  3. 从Scratch到Python——python turtle 一种比pygame更加简洁的实现

    从Scratch到Python--python turtle 一种比pygame更加简洁的实现 现在很多学校都开设了Scratch课程,学生可以利用Scratch创作丰富的作品,然而Scratch之后 ...

  4. vue入门练习(一)

    1.安装node,webpack node -v //查看已安装版本 npm install -g webpack  //安装webpack npm install -g webpack-dev-se ...

  5. Hadoop之运行环境搭建

    一.虚拟机环境准备 1.克隆虚拟机 2.修改克隆虚拟机静态IP 3.修改主机名 4.关闭防火墙 5.创建hadoop用户 6.配置hadoop用户具有root权限 7.在/opt 目录下创建文件夹 1 ...

  6. 2018-2019-2 20165303《网络攻防技术》Exp5 MSF基础应用

    实践目标 1.一个主动攻击实践 ms17_010(成功) ms08_067(成功) 2.一个针对浏览器的攻击 ms13-008(成功唯一) ms11-050(失败) ms13-069(成功唯一) ad ...

  7. js判断当前浏览器

    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isOpera = userAgent.indexOf("Opera ...

  8. JavaScript入门篇

    记录一下在慕课网学习JavaScript的过程. 以下内容均来自慕课网. 传送:https://www.imooc.com/code/401 为什么学习JavaScript 1. 所有主流浏览器都支持 ...

  9. select top 1 和select top 1 with ties * from SC 的区别

    select top1 : * FROM SC ORDER BY score DESC 运行结果如下: sc表数据查询select top 1 S# C# Score 001 03 120 WITH ...

  10. js 取得当天0点 / 23:59:59 时间

    js 取得当天0点 / 23:59:59 时间   js 取得今天0点: const start = new Date(new Date(new Date().toLocaleDateString() ...