JVM内存回收机制及回收器-一目了然
需求:正确高效(不能对用户线程有较大的影响)
二、设计
我来设计的话,一些基本的问题。哪些对象需要被回收?谁来回收? 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的垃圾收集器。
![](/assets/blank.gif)
没有一个垃圾回收器能解决所有的问题,针对不同的场景需要不同的垃圾回收器。单线程的Serial与Serial Old也不是不好,在单CPU下他就是最好的。也希望JAVA能推出新一代的垃圾回收器,为我们高效低回垃回收内存。
《深入理解java虚拟机》Garbage Collection: http://labs.oracle.com/jtech/pubs/#gc
JVM内存回收机制及回收器-一目了然相关推荐
- Java jvm 内存回收机制
原文:Java jvm 内存回收机制 源代码下载地址:http://www.zuidaima.com/share/1782298898271232.htm 在Java中,它的内存管理包括两方面:内存分 ...
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
- Java进阶3. 内存回收机制
Java进阶3. 内存回收机制 20131029 前言: 学过C++的都知道,C++中内存需要程序员自己维护.说道这里,很多开发的同学就感觉很痛苦,当他转向Java的时候,就会说你看Java多好啊,程 ...
- JVM架构、JVM垃圾回收机制、垃圾回收算法、垃圾回收器、JMM(内存模型)
0 JVM和Java的关系 JDK = JRE + Java开发工具(java,javac,javadoc,javap-) JRE = JVM + Java核心类库 即: JDK = JVM + Ja ...
- JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探
一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...
- JVM内存管理机制和垃圾回收机制
JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...
- jvm对象从新生代到老年代_JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代...
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- 2.JVM垃圾回收机制-什么时候回收内存
在前面的文章中,我们介绍过JVM垃圾回收机制负责的是堆和方法区的内存. 参考:http://blog.csdn.net/u011983531/article/details/49227013 在本篇中 ...
- 2.Java内存回收机制
一.Java对象在内存引用状态 内存泄露:程序运行过程中,会不断分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收回来,这就是内存泄漏 ...
最新文章
- 美国12大科技公司如何参与自动驾驶?
- 扫地机器人单扫和双扫_小米扫拖机器人体验:再见了,拖把君
- 日期和毫秒值 例子
- 强大的负载均衡+静态文件WEB服务器nginx实战
- 爬取嘉兴市人才网即时招聘信息并写入文本TXT完整案例
- QC七大手法(New)
- 【梳理】离散数学 第15章 欧拉图与哈密顿图 15.3 最短路问题、中国邮递员问题与货郎担问题
- 梦幻西游html源码,index.html
- 为防止办公用计算机上的数据,2019年9月计算机一级Ms Office提分练习题(总)
- Windows实现微信双(多)开—微信分身
- 重磅|云迹科技获金茂资本、携程集团、光控众盈,海银资本联合投资...
- 为什么大部分公司的数据库系统仍然要使用oracle?
- 关于决策树可视化各项展示数据的解读(泰坦尼克号预测生还案例Titanic)
- sports.php什么意思,使用Yahoo Fantasy Sports API的PHP和JSON
- 网站突然无法访问解决方案
- STM32单片机开发应用教程 (HAL库版) ---基于国信长天嵌入式竞赛实训平台(CT117E-M4)教程汇总 与第一章 硬件平台简介
- 环卫事业编2000工资,为何本科生抢着干?这3点好处,他们不会说
- 吴恩达又双叒叕刷屏了_你准备入坑了吗?
- nero刻录下载_Nero的3种替代品,可用于Linux CD和DVD刻录
- AI Security3-通用漏洞披露(CVE: Common Vulnerabilities and Exposures)