`
和你在一起
  • 浏览: 681711 次
  • 性别: 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-12.docx

    本文将对 JVM 调优进行总结,涵盖了 JVM 调优的基本概念、垃圾回收算法、分代垃圾回收、典型配置举例、调优方法、反思等方面的内容。 JVM 调优的基本概念 JVM 调优是指通过调整 JVM 的参数和配置来提高 Java 应用...

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

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

    JVM的调优总结----------

    ### JVM调优总结 #### 1. JVM配置 在Java应用程序的运行过程中,JVM(Java虚拟机)扮演着至关重要的角色。为了确保应用程序能够高效稳定地运行,正确配置JVM参数至关重要。以下是一些常见的JVM配置参数及其含义: ...

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

    Java虚拟机(JVM)调优是一个复杂...总的来说,JVM调优中的垃圾回收算法选择需根据应用程序的需求、硬件资源和性能指标来决定。理解这些算法的原理和优缺点,可以帮助开发者有效地调整JVM参数,以达到最佳的系统性能。

    JVM调优总结PDF,带原理图

    本文旨在通过对JVM调优的基础概念和常见的垃圾回收算法进行深入剖析,帮助读者更好地理解和掌握JVM调优的关键技术。 #### 二、基础概念与垃圾回收算法 ##### 2.1 引用计数(Reference Counting) 引用计数是一种...

    JVM调优总结.pdf

    基本垃圾回收算法涉及到如何识别和回收不再使用的对象,而分代垃圾回收则是对堆空间进行分区,以更好地管理不同生命周期的对象。垃圾回收面临的问题包括处理速度、暂停时间和内存碎片等问题。 在典型配置举例部分,...

    深入虚拟机---JVM调优总结(摘自网上网上大牛分享).pdf

    基本的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法以及分代收集算法。分代收集算法是现代JVM采用的主流算法,它基于这样的观察:大多数对象的生命周期都比较短,而存活时间较长的对象比较少。 在垃圾...

    JVM调优总结.doc

    "JVM调优总结" ...JVM调优是一种非常复杂的技术,需要我们对JVM的内部机理和垃圾回收算法有深入的理解。只有通过不断的学习和实践,我们才能更好地掌握JVM调优技术,提高Java应用程序的性能和稳定性。

    用于测试jvm gc调优-share-jvm-gc.zip

    "用于测试jvm gc调优-share-jvm-gc.zip"这个压缩包文件很可能包含了一些工具、脚本或教程,用于帮助我们了解和实践JVM的垃圾收集优化。 首先,我们需要理解JVM GC的基本原理。垃圾收集器的主要任务是识别并回收不再...

    jvm基础知识与调优-jvm-training.zip

    4. **JVM调优** - 参数调整:通过JVM启动参数设置堆大小(-Xms, -Xmx)、新生代与老年代比例(-XX:NewRatio)、存活对象阈值(-XX:SurvivorRatio)等。 - 垃圾回收日志分析:通过`-XX:+PrintGCDetails`等参数记录...

    JVM调优总结(4)分代垃圾回收Java开发Java经验技

    二、垃圾回收算法 1. Minor GC:主要针对新生代进行的垃圾回收,速度快,停顿时间短。 2. Major GC/Full GC:涉及老年代的垃圾回收,可能会导致长时间的系统停顿,应尽量避免频繁发生。 三、垃圾回收器介绍 1. ...

    马老师jvm调优实战笔记

    本笔记是马老师的 JVM 调优实战笔记,涵盖了 JVM 的概述、内存结构、堆内存、垃圾回收算法、JVM 参数等方面的内容。 JVM 调优目录 JVM 调优是 JavaVirtual Machine(Java 虚拟机)的优化过程,目的是为了提高 Java...

    Java-JVM调优总结

    ### Java-JVM调优总结 #### 一、引言 在现代软件开发中,Java 作为一种广泛使用的编程语言,其应用程序的性能优化至关重要。而 JVM(Java Virtual Machine)作为 Java 程序运行的基础环境,对其进行合理的调优可以...

    马士兵jvm调优笔记.docx

    ### 马士兵JVM调优笔记知识点梳理 ...以上是基于《马士兵JVM调优笔记》文档内容整理的关键知识点总结。通过理解和掌握这些概念与技巧,可以帮助开发者更高效地管理和优化Java应用程序的内存使用情况。

    JVM调优的测试项目-JVM-subject.zip

    2. **GC(Garbage Collection)机制**:JVM自动进行垃圾回收,包括新生代GC(Minor GC)、老年代GC(Major GC)和全堆GC(Full GC)。了解不同GC算法(如Serial、Parallel、CMS、G1等)的工作原理和适用场景,可以...

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

    基本垃圾回收算法主要分为三种:引用计数、可达性分析清理和增量收集。引用计数算法通过跟踪记录每个对象被引用的次数来判断对象是否应该被回收,但在处理循环引用时存在缺陷。可达性分析清理算法通过标记-清除、...

Global site tag (gtag.js) - Google Analytics