`
和你在一起
  • 浏览: 677628 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM调优总结(三)-基本垃圾回收算法

阅读更多

 

可以从不同的的角度去划分垃圾回收算法:

按照基本回收策略分

引用计数(Reference Counting):

比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

 

标记-清除(Mark-Sweep):

 

 

此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

 

复制(Copying):

 

 

此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

 

标记-整理(Mark-Compact):

 

 

此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

按分区对待的方式分

增量收集(Incremental Collecting):实时垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。

 

分代收集(Generational Collecting):基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

 

按系统线程分

串行收集:串行收集使用单线程处理所有垃圾回收工作,因为无需多线程交互,实现容易,而且效率比较高。但是,其局限性也比较明显,即无法使用多处理器的优势,所以此收集适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。

 

并行收集:并行收集使用多线程处理垃圾回收工作,因而速度快,效率高。而且理论上CPU数目越多,越能体现出并行收集器的优势。

 

并发收集:相对于串行收集和并行收集而言,前面两个在进行垃圾回收工作时,需要暂停整个运行环境,而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且暂停时间会因为堆越大而越长。

36
6
分享到:
评论
17 楼 lliiqiang 2015-12-07  
引用计数法可以解决大多数情况地垃圾回收,其实我地建议是通常使用引用计数法回收对象,只有当内存不足的时候才使用标记清除法。
16 楼 lichong_87 2011-10-19  
lichong_87 写道
我想问下,在后面的几种策略中垃圾回收的时候如果该对象没有被引用那么就XXX,那么怎么确定一个对象是否被引用啊?谢谢了

原来在后面一篇讲到了,谢谢分享,受益匪浅啊!!!
15 楼 lichong_87 2011-10-19  
我想问下,在后面的几种策略中垃圾回收的时候如果该对象没有被引用那么就XXX,那么怎么确定一个对象是否被引用啊?谢谢了
14 楼 fengchufu 2011-09-28  
我是专程来拜读学习的。
13 楼 jerrycong 2009-12-07  
jerrycong 写道
引用
把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。
年轻代,年老代,持久代一般各采用什么回收策略?

12 楼 jerrycong 2009-12-07  
引用
把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。


年轻代,年老代,持久代一般各采用什么回收策略?
11 楼 zhwayne 2009-11-26  
zhwayne 写道
myali88 写道
请教博主,
    1.垃圾收集器是不是只回收Heap?
    2.Heap在逻辑上按代划分是如何的?我本来认为是只包含 tenured generation 和 young generation的,而 permanent generation 则属于非Heap , 但看到http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#1.1.Sizing%20the%20Generations|outline
里的
引用
The different parts of the heap (permanent generation, tenured generation, and young generation) can grow to the limit of the virtual space as needed.
,我就迷惑了?
    3.JVM规范里将其内存模型称为Runtime Data Area ,其中包含:pc register,method area,java heap,java stack,native stack,这些与tenured generation , young generation 和 permanent generation如何对应?

java中的所有对象都在堆上分配内存,因此垃圾回收只针对堆。
年轻态,年老态都是针对java几次垃圾回收后对象是否被引用的状态,对象本身还是在堆上的。
至于永久态,保存的是类型信息,实际是方法区,方法区也有可能是在堆上分配的空间。

对于jvm垃圾回收机制采用的方法很多,博主只是做概要的介绍,大家可以着重了解ibm和sun所采用的两种回收机制,google就可以找到了。


忘了,如果方法区不在堆上,那GC还得负责这部分垃圾的回收
10 楼 zhwayne 2009-11-26  
myali88 写道
请教博主,
    1.垃圾收集器是不是只回收Heap?
    2.Heap在逻辑上按代划分是如何的?我本来认为是只包含 tenured generation 和 young generation的,而 permanent generation 则属于非Heap , 但看到http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#1.1.Sizing%20the%20Generations|outline
里的
引用
The different parts of the heap (permanent generation, tenured generation, and young generation) can grow to the limit of the virtual space as needed.
,我就迷惑了?
    3.JVM规范里将其内存模型称为Runtime Data Area ,其中包含:pc register,method area,java heap,java stack,native stack,这些与tenured generation , young generation 和 permanent generation如何对应?

java中的所有对象都在堆上分配内存,因此垃圾回收只针对堆。
年轻态,年老态都是针对java几次垃圾回收后对象是否被引用的状态,对象本身还是在堆上的。
至于永久态,保存的是类型信息,实际是方法区,方法区也有可能是在堆上分配的空间。

对于jvm垃圾回收机制采用的方法很多,博主只是做概要的介绍,大家可以着重了解ibm和sun所采用的两种回收机制,google就可以找到了。
9 楼 zzl_zhang 2009-11-26  
没有前二章讲得细,看了不是很明白。
8 楼 jeff312 2009-11-20  
“复制”式GC,正好体现了用空间换时间的思想。
7 楼 hxy-go 2009-11-20  
详细参考
http://www.ibm.com/developerworks/ibm/library/i-garbage1/
6 楼 和你在一起 2009-11-19  
@myali88
问的好细啊,有些地方可能不一定说的对,你看看吧。

1、2、3应该是同一个问题:)
tenured generation和young generation存的都是对象,这个没什么说的。permanent generation中存的是类描述信息,对应method area。垃圾回收时,会回收tenured generation、young generation、permanent generation三个区。jvm spec给的只是规范,实现上可能根据虚拟机不同实现也不同。

另外,需要特别对“Heap”说明一下,jvm spec中的Heap可能与我们平时看到的虚拟机的heap所有不同,前者对应tenured generation、young generation;而后者,我们往往把permanent generation也算在内了。因此,可能造成了理解上的不同。个人觉得两者理解都不错。

至于pc register、java stack、native stack,看名字就知道,都是运行相关东西,跟“堆”没什么关系。
5 楼 和你在一起 2009-11-19  
@zhxing
呵呵,其实还是比较清楚的。

灰色:垃圾。
绿色:存活区。
蓝色:存活区,并且是占用比较大的,比如大对象一类。因此,图上横跨了两块内存区。
橙色:待使用的内存块。在复制算法下,内存区被划分为两块同等大小的区域,交换着使用。
4 楼 Aguo 2009-11-19  
zhxing 写道
对那些颜色块不大明白是各表示什么意思。
如果再详细分析下就好了

同感
3 楼 ftp51423121 2009-11-19  
  
2 楼 myali88 2009-11-19  
请教博主,
    1.垃圾收集器是不是只回收Heap?
    2.Heap在逻辑上按代划分是如何的?我本来认为是只包含 tenured generation 和 young generation的,而 permanent generation 则属于非Heap , 但看到http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html#1.1.Sizing%20the%20Generations|outline
里的
引用
The different parts of the heap (permanent generation, tenured generation, and young generation) can grow to the limit of the virtual space as needed.
,我就迷惑了?
    3.JVM规范里将其内存模型称为Runtime Data Area ,其中包含:pc register,method area,java heap,java stack,native stack,这些与tenured generation , young generation 和 permanent generation如何对应?
1 楼 zhxing 2009-11-19  
对那些颜色块不大明白是各表示什么意思。
如果再详细分析下就好了

相关推荐

    JVM调优总结

    1.4 JVM调优总结(三)-基本垃圾回收算法 9 1.5 JVM调优总结(四)-垃圾回收面临的问题 12 1.6 JVM调优总结(五)-分代垃圾回收详述1 14 1.7 JVM调优总结(六)-分代垃圾回收详述 1.8 JVM调优总结(七)-典型配置...

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old、G1 JVM调优:命令行指令,设置堆内存大小的参数

    JVM调优总结(三)基本垃圾回收算法.pdf

    JVM调优总结(三)基本垃圾回收算法.pdf

    深入java虚拟机

    1.3 JVM调优总结(三)-基本垃圾回收算法 1.4 JVM调优总结(四)-垃圾回收面临的问题 1.5 JVM调优总结(五)-分代垃圾回收详述1 1.6 JVM调优总结(六)-分代垃圾回收详述2 1.7 JVM调优总结(七)-典型配置举例1 1.8 ...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)算法 第五节:垃圾回收器 1.1Serial/Serial Old收集器 1.2 ParNew收集器 1.3Parallel Scavenge收集器 1.4Parallel Old收集器 1.5CMS...

    马士兵jvm调优笔记.docx

    一.java内存结构 2 二 垃圾收集算法: 3 三 JVM参数 4 四 JVM的垃圾回收集器 7 五 常用参数设置 7

    JVM性能调优-JVM内存整理及GC回收

    很好的学习资料,很详细的讲述了JVM性能调优,JVM内存模型,垃圾回收原理算法等等,很适合JAVA程序员阅读。

    JVM调优.txt

    JVM调优的一些常用设置. 回收器选择 JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是...

    JVM参数调优、垃圾回收算法及原理体系.docx

    JVM参数调优、垃圾回收算法及原理体系.docx

    resin-jvm 调优

    1.JVM的gc概述 gc即垃圾收集机制是指...在设置了上述参数后可以通过Visualgc 来观察垃圾回收的一些参数状态,再做相应的调整来改善性能。一般的标准是减少fullgc的次数,最好硬件支持使用并行垃圾回收(要求多CPU)。

    JVM的垃圾回收机制详解和调优

    JVM的垃圾回收机制详解和调优,gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何工作。不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和...

    JVM内存模型详解

    jvm内存模型,jvm脑图,jvm调优,jvm垃圾回收算法,jvm垃圾回收器,逃逸算法等总结。

    jMM+JVM-GC COLLECTOR+调优.pptx

    一个PPT包含 java内存模型,class运行机制。 java jvm垃圾回收算法 java jvm gc常见垃圾回收算法分析 java jvm调优

    JVM分享,包含JVM的优化目标、优化原则、JVM组成、内存区域划分、垃圾回收算法、垃圾回收器、FullGC触发时机等等.

    JVM的内容分享,包含JVM的优化目标、优化原则、JVM组成、内存区域划分、垃圾回收算法、垃圾回收器、FullGC触发时机、对象布局、元空间存储、GC调优

    JVM实战参数调优

    JVM实战参数调优与垃圾回收机制算法资料

    JVM体系结构与GC调优

    JVM体系结构与GC调优相关介绍,包含JVM体系结构、常用GC算法、内存管理、垃圾回收器、虚拟机调优、相关监控工具等

    这几种常见的JVM调优场景你知道吗?

    假定你已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器。 一、cpu占用过高 cpu占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第37节垃圾回收算法-标记整理算法和分代收集算法00:05:24分钟 | 第38节垃圾收集器-serial收集器详解00:09:45分钟 | 第39节垃圾收集器-parnew收集器详解00:04:53分钟 | 第40节垃圾收集器-parallel收集器详解00:11:...

    JVM内存调优深入文章共享

    最近总结JVM内存调优的一些东西,基本上是网上一些资料的汇总。 文章从算法,垃圾回收机制等多个方面对JVM的工作机制进行描述,使读者对JVM 有个全面的了解。

Global site tag (gtag.js) - Google Analytics