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. Gradle 简记

    不是 Gradle,就是 Maven吧.对比下: Maven: 推荐(?)了一个默认的项目结构和生命周期,但是太过死板 虽然暴露了 API 接口,但是插件定制太过复杂 和 Ant 一样,仍然无法表达复 ...

  2. 剑指offer 12:数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. public class Solution { public double P ...

  3. Manjaro安装后,应该做的操作,仅作为自己备份使用,如有参考不懂,请留言咨询,或Q609916691

    家目录下,通用文件夹名称中英文互转: --(1)中文->英文 export LANG=en_US.UTF-8 xdg-user-dirs-update --force --(2)英文->中 ...

  4. selenium+java 数据驱动

    一.数据驱动测试概念 数据驱动测试是相同的测试脚本使用不同的测试数据执行,测试数据和测试行为完全分离. 二.实施数据驱动测试的步骤: 1.编写测试脚本,脚本需要支持程序对象.文件或者数据库读入测试数据 ...

  5. 02-VC中的变量类型

    lp: long pointerb: BOOLsz: string zero(以0结尾的字符串) typedef const char* LPCSTRtypedef unsigned long DWO ...

  6. springboot缓存注解——@CachePut

    @CachePut:既调用方法,又更新缓存数据:修改了数据库的某个数据,同时又更新缓存 运行时机: 先调用目标方法 将目标方法的结果缓存起来 注意: @Cacheable的key不能用#result来 ...

  7. 【转】RTP学习笔记

    转自:https://www.cnblogs.com/yoyotl/p/5650101.html 一.定义 实时传输协议(Real- time Transport Protocol,RTP)是在Int ...

  8. ionic3 在windows环境下打包android 正式签名版APK

    生成签名文件keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore demo为 ...

  9. 初学Git命令

    初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 使用命令git add <file>,注意,可反复多次使用,添加多个文件: 使用命令git commit ...

  10. angular 引入编辑器以及控制器的学习和理解。。。

    在angular中引入编辑器的时候花了很长时间,然后发现自己以前根本就没好好用过angular,因为项目是接手的学姐的,学姐又是接手的学姐的,到我这里就只是写写页面的事了. 引入编辑器差了好多好多资料 ...