一、概述
内存回收,分析出所以然,为什么如此设计,内存回收,如整理屋子。用户就是系统,其实和普通的系统没有大区别。
需求:
正确
高效(不能对用户线程有较大的影响)

二、设计

我来设计的话,一些基本的问题。
哪些对象需要被回收?
谁来回收? JVM
在哪里回收?  一般堆上,栈上回收比较困难
在什么时候回收? 
怎么回收?
第一个问题:
哪些对象需要被回收?
我们需要先标记出来,
大致有两个标记的算法,
第一:引用计算法。就是 引用了就加1,减少一个引用就减1.但是无法解决 互相引用的问题。故JAVA没有采用了。为什么别的语言采取了,我也不知道。
第二:根搜索算法
从根 GC roots开始找,如果是根不可达的对象就是 可回收的对象。JAVA JVM就是采取这种方式实现的。
第二问题:
     谁来回收?
     那肯定要一个名称,叫垃圾回收器,运行在回收线程里面。垃圾回收器具体要解决什么时候做,如何回收的问题。
第三个问题:在哪里回收?
一般在堆上。栈上回收比较困难,栈上也可以进行内存回收,不过条件太苛刻了。

第四个问题与第五个问题一起回答了:

在什么时候回收?  基本是在内存不够用的时候。每个收集器还所有不同。
垃圾回收基本的思想是:stop-the-world再回收,就如:不能在打扫卫生的时候同时再仍新的垃圾。
但是CMS、与将出世的 G1会打破这个界限,实现 边打扫卫生,还边扔垃圾。
怎么回收:一般有三个基本的算法: 
1、标记清除:直接标记,再清除掉需要回收的内存。(产生大量的内存碎片)
2、标记复制:用两个一样的大小的内存,总只有一块再用,回收时没有回收的部分直接复制到另一块上去。
3、标记整理:先标记,让所有存活的对象向一段移动,然后直接清除掉边界外的内存。
java中的处理:
根据对象的存活生命周期将不同的内存分为几块。新生代与老年代
新生代有大量的对象死去,只有少量的对象存活,所以用复制算法。
老年代对象存活周期长,没有额外的担保空间,就必须用 标记清除 与标记整理 的算法。
以下再描述下:
为了解决对象生命周期长短对回收的影响,在hotSpot中主要分为了:
young与old区。
young区的大部分对象基本可以回收,所以采取了 标记复制算法。(复制算法就是浪费了50%的内存),为了不浪费太多的内存,采取了 两个交换区与一个Eden区。交换区互换地存下每次young gc留下来的对象,如果存不下就需要  old区来担保了(多余的对象直接进入old区)。
old区内存一般停留比较久,内存也比较大,他也找不到担保内存了,也不可能把内存分为两部分互相拷贝。所以一开始就采取了 标记整理 的算法。(开始一直认为 标记清除  算法会产生大量的内存碎片,会很不好,后来回收器设计者的想法可能变了)。
根据线程数为单线程与多线程,追求 目标不同。先后有:
young区:Serial(单线程)、parNew(多线程)、Parallel Scavenge(多线程,追求高的CPU吞吐量,与前者的并行是不同的实现)。
Old区:Serial Old(单线程,是Serial的Old版本 )、Parallel Old(多线程,追求高的CPU吞吐量,是Parallel Scavenge的Old版本)
问题1:?为什么parNew没有Old的版本呢?
可能是 
Parallel Old 已经好用了,没有必要再弄一个parNew Old吧。不过有点牵强。还有原因就是 没有资源弄了,大家都开发g1去了。嘿嘿。。。

问题2:?为什么young区有两个多线程的回收器?
可能是:他们的来源不一样,一个是自己实现的,一个用了部分 Exact VM的分代式GC框架的思想。这个也是Parallel Scavenge与CMS不兼容的原因。
     CMS(coururrent Mark Sweep)收集器,可以容许 用户线程与回收线程在回收的大部分时间里并行运行。
算法是:

标记清除,因为不需要移动对象的内存,所以实现并发处理相对简单些。

CMS大致的过程是:

初始标记,并发标记(与用户线程并发运行),重新标记,并发清除(与用户线程并发运行)。

在并发清除中,(用户线程还在运行)会产生浮动垃圾,垃圾一多,用户线程不能申请内存时,会产生 Concurrent Mode Failure错误,再会触发一次Serial Old Full GC,这个也是下图:CMS与Serial Old连着的原因.
为什么会触发一个 单线程的 full gc呢.估计原因是没有时间做多线程的。
后来把资源投入到了  Garbage Collection  的研发上去了。
在jdk7中估计会产生重量级的垃圾回收器  Garbage First简称G1。此改进了CMS的内存碎片的问题,把算法由 标记清除,变为了标记整理。主要是 把堆再分为不同的小区,对垃圾较多的优先回收。基本能实现 实时java的垃圾收集器
下图展示了目前jdk1.6的回收器。回收器连线表示可以互相协同作战。旁边有一些参数主要作为调试用。
三、结尾
没有一个垃圾回收器能解决所有的问题,针对不同的场景需要不同的垃圾回收器。单线程的Serial与Serial Old也不是不好,在单CPU下他就是最好的。
也希望JAVA能推出新一代的垃圾回收器,为我们高效低回垃回收内存。
四、参考资料
 《深入理解java虚拟机》
Garbage Collection: http://labs.oracle.com/jtech/pubs/#gc

JVM内存回收机制及回收器-一目了然相关推荐

  1. Java jvm 内存回收机制

    原文:Java jvm 内存回收机制 源代码下载地址:http://www.zuidaima.com/share/1782298898271232.htm 在Java中,它的内存管理包括两方面:内存分 ...

  2. Java技术专题之JVM逻辑内存回收机制研究图解版

    一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...

  3. Java进阶3. 内存回收机制

    Java进阶3. 内存回收机制 20131029 前言: 学过C++的都知道,C++中内存需要程序员自己维护.说道这里,很多开发的同学就感觉很痛苦,当他转向Java的时候,就会说你看Java多好啊,程 ...

  4. JVM架构、JVM垃圾回收机制、垃圾回收算法、垃圾回收器、JMM(内存模型)

    0 JVM和Java的关系 JDK = JRE + Java开发工具(java,javac,javadoc,javap-) JRE = JVM + Java核心类库 即: JDK = JVM + Ja ...

  5. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

    一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...

  6. JVM内存管理机制和垃圾回收机制

    JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...

  7. jvm对象从新生代到老年代_JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代...

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  8. 2.JVM垃圾回收机制-什么时候回收内存

    在前面的文章中,我们介绍过JVM垃圾回收机制负责的是堆和方法区的内存. 参考:http://blog.csdn.net/u011983531/article/details/49227013 在本篇中 ...

  9. 2.Java内存回收机制

    一.Java对象在内存引用状态 内存泄露:程序运行过程中,会不断分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收回来,这就是内存泄漏 ...

最新文章

  1. 美国12大科技公司如何参与自动驾驶?
  2. 扫地机器人单扫和双扫_小米扫拖机器人体验:再见了,拖把君
  3. 日期和毫秒值 例子
  4. 强大的负载均衡+静态文件WEB服务器nginx实战
  5. 爬取嘉兴市人才网即时招聘信息并写入文本TXT完整案例
  6. QC七大手法(New)
  7. 【梳理】离散数学 第15章 欧拉图与哈密顿图 15.3 最短路问题、中国邮递员问题与货郎担问题
  8. 梦幻西游html源码,index.html
  9. 为防止办公用计算机上的数据,2019年9月计算机一级Ms Office提分练习题(总)
  10. Windows实现微信双(多)开—微信分身
  11. 重磅|云迹科技获金茂资本、携程集团、光控众盈,海银资本联合投资...
  12. 为什么大部分公司的数据库系统仍然要使用oracle?
  13. 关于决策树可视化各项展示数据的解读(泰坦尼克号预测生还案例Titanic)
  14. sports.php什么意思,使用Yahoo Fantasy Sports API的PHP和JSON
  15. 网站突然无法访问解决方案
  16. STM32单片机开发应用教程 (HAL库版) ---基于国信长天嵌入式竞赛实训平台(CT117E-M4)教程汇总 与第一章 硬件平台简介
  17. 环卫事业编2000工资,为何本科生抢着干?这3点好处,他们不会说
  18. 吴恩达又双叒叕刷屏了_你准备入坑了吗?
  19. nero刻录下载_Nero的3种替代品,可用于Linux CD和DVD刻录
  20. AI Security3-通用漏洞披露(CVE: Common Vulnerabilities and Exposures)

热门文章

  1. 单片机低功耗配置及注意事项
  2. 2020JavaScript技能抽查
  3. 解决Fiddler不能抓包问题
  4. 什么是python 包_什么是python包
  5. 【Quectel移远展锐平台5G模组RX500U/RG200U使用指南(三)-PCIE】
  6. Quectel EC20 R2.1 AT指令集(基础部分)
  7. C# WPF 页面切换(Page)
  8. ASPX页面AJAX调用ASPX后台
  9. SQL Server 安全认证知识【1】
  10. 如何挑选自己喜欢的colormap样式