1.垃圾回收算法
1.1标记-清除
该算法主要分为标记和清除两个阶段,先对需要回收的对象进行标记,然后再进行清除,该算法的有点是简单,缺点有两个,一个是效率问题,标记和清除的效率都不高,另一个问题是空间问题,标记清除之后会造成大量的空间碎片,当程序需要分配一个大对象而无法找到连续的空间时就必须出发一次垃圾回收。
1.2复制算法
该算法是将内存空间分为大小相等的两块,在其中的一块进行对象的分配,需要垃圾回收时将其中一块存活的对象拷贝到另一块即可,然后把用过的内存块给清理掉,该算法的有点是:不用考虑内存碎片问题,实现简单,运行高效,缺点是:将内存缩小为了原来的一半,代价有点儿高。
现代的虚拟机都是采用此中算法来进行新生代的垃圾回收的,由于java中的新生代对象具有”朝生夕死“的特点,所以讲内存分为一块较大的Eden空间和两块较小的Survivor空间,每次使用Eden和Survivor空间,HopSpot默认的比例是8:1,按照此种比例,新生代的空间为90%,只有10%的空间会被浪费掉,如果进行了一次垃圾回收survivor仍然不能满足空间的需要,此时需要通过分配担保机制将相关的对象分配到老年代中。
1.3标记-整理算法
复制算法在对象存活率较高的情况下就要执行较多的复制操作,效率会变低,另外如果不想浪费50%的空间,还需要进行分配担保机制,以应对100%极端存活的情况,所以老年代不用此种算法。
老年代采用”标记-整理“的算法,标记过程和标记-清除算法一样,但是整理却是所有存活的对象向一端移动,然后清理掉边界意外的内存。
1.4分代收集算法
当前的商业虚拟机都此种收集算法,根据对象的存活周期将内存分为几块,一般讲java堆分为新生代和老年代,在新生代,采用复制算法,而对于老年代,对象存活率高,没有额外的空间进行分配担保,就不许使用”标记-整理“ 或者”标记-清除“进行垃圾回收。
2.垃圾收集器
2.1Serial 收集器
特点:是一个单线程的垃圾回收期,在进行垃圾回收时必须暂停其他所有的工作线程。
优点:简单而高效,没有线程交互的开销。Serial收集器对于运行在Client模式下的虚拟机来说是一个很好的选择,也是该模式下的默认垃圾收集器。
2.2ParNew收集器
是Serial收集器的多线程版本,属性和参数与Serial收集器相同。
该收集器是server模式下的新生代默认收集器,除了Serial,只有它能够和CMS收集器配合工作。
2.3Parallel Scavenge
特点:是一个新生代收集器,使用复制算法,并行和多线程收集器,它会尽可能的缩短垃圾回收时用户线程的停顿时间,目标是达到一个可控制的吞吐量,所谓吞吐量是cpu运行用户代码的时间和cpu总消耗时间的比值,该收集器被称为”吞吐量“优先的收集器,另外该收集器还有一个-XX:+UseAdaptiveSizePolicy,用来自动调节新生代的大小,,自适应调节策略也是与ParNew的主要的区别。
2.4Serial Old收集器
Serial Old是Serial的老年代版本,采用”标记-整理“算法进行垃圾回收,被client下的虚拟机使用,在Server模式下:一个用途是和jdk1.5之前的版本中Parallet Scavenge收集器搭配使用,另外一个用户就是作为CMS收集器的后备预案。
2.5Parallel Old 收集器
该收集器是parallel Scavenge收集器的老年代版本,使用多线程和”标记整理“算法。
主要是为了与Parallel Scavenge配合使用,如果新生代选择了Parallel Scavenge收集器,那么老年代除了Serial Old外别无选择,单线程的Serial old在服务器性能上会严重下降。
2.6 CMS 收集器
CMS(concurrent mark Sweep)是一种以获取最短回收停顿时间为目标的收集器,该收集器复杂一点,收集时候分为以下四步:
1>初始标记。
2>并发标记。
3>重新标记。
4>并发清除。
初始标记和重新标记这两个过程仍然要停止用户线程,重新标记是为了修正在初始标记和用户线程同时执行新产生的需要被清除的对象,这两个过程很快,主要的耗时是并发标记和并发清除中。
该收集器有三个缺点:
1>对cpu敏感。cms默认开启的回收线程数目为(cpu数量+3)/4,如果cpu过多会导致用户感到突然停顿。
2>cms无法处理浮动垃圾。由于cms并发清理阶段用户线程还在不断地运行,这一部分垃圾可能出现在标记之后,cms无法处理他们,只好在下一次进行一次处理。
3>cms是基于“标记-清除”算法,可能会产生大量的内存碎片。
2.7 G1收集器
在jdk1.6 update14中提供了一个使用版本,与前面的cms相比,他是基于“标记-整理”算法,不会产生内存碎片,另外他可以精确的控制停顿,让垃圾回收不超过N毫秒,另外他还可以在不牺牲吞吐量的情况下完成低停顿的垃圾回收,这是因为它会避免在全区域进行垃圾回收,g1会将整个java堆划分为多个大小固定的独立区域,并根据这些垃圾的堆积程度,在后台维护一个垃圾优先列表,,优先回收垃圾最多的区域。
分享到:
相关推荐
本文详细探讨了JVM中的垃圾收集器和垃圾收集算法,以帮助开发者深入理解Java虚拟机的内部运作机制。 垃圾收集(GC,Garbage Collection)是JVM的一个重要功能,用于自动释放不再使用的对象所占用的内存空间,以防止...
深入理解JVM垃圾收集算法与垃圾收集器
漫谈Java垃圾收集器 Java垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,旨在释放程序员从手动内存管理的繁琐...但是,Java垃圾收集器也存在一些问题,需要程序员根据实际情况选择合适的垃圾收集器和参数。
"基于实时性的Java虚拟机垃圾收集算法" 本文介绍了一种基于实时性的Java虚拟机垃圾收集算法,该算法旨在减少垃圾收集带来的不确定性暂停,并使用户可以指定一个时间段内垃圾收集导致应用程序暂停的最长时间。该算法...
基于实时性的Java虚拟机垃圾收集算法通过对堆空间划分、引用追踪等方面的改进,成功地减少了GC带来的不确定暂停,降低了暂停的频率和时长,极大地提升了Java在实时性环境下的适用性。这对于工业控制、实时网络游戏等...
在这篇手册中,我们将深入探究 Java 垃圾收集的基础知识,包括垃圾收集的定义、垃圾收集算法、垃圾收集器的实现、垃圾收集优化等内容。 垃圾收集的定义 垃圾收集(Garbage Collection,简称 GC)是指在 Java 语言中...
在Java中,常用的垃圾收集算法包括引用计数(Reference Counting)、标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact)和分代收集(Generational Collection)等。引用计数算法是通过跟踪记录每...
总之,垃圾收集器是Java生态系统中不可或缺的一部分,深入理解和合理运用GC机制,对于构建高效、稳定的Java应用程序至关重要。随着Java技术的不断演进,GC也将持续优化,为开发者带来更加便捷的开发体验。
主要整理内容为:分析了垃圾收集的算法和JDK1.7中提供的7款垃圾收集器的特点以及运作原理。以及内存分配策略
垃圾收集器的工作策略包括多种,如标记-清除、复制算法、标记-整理和分代收集等。这些策略根据JVM的实现和应用的需求,可以进行组合和优化,以达到最佳的内存管理和性能。例如,分代收集策略将堆分为新生代和老年代...
在实际应用中,选择哪种垃圾收集算法取决于具体的应用场景和性能需求。例如,在高度交互的系统或实时系统中,引用计数算法因其低延迟特性可能更为合适;而在对内存连续性和程序执行连续性要求较高的场景下,标记-...
Java堆是垃圾收集器的主要工作区域,因为所有Java对象都在堆中创建和销毁。由于堆空间有限,有效的内存管理对于程序的性能至关重要,垃圾收集器就是实现这一目标的关键机制。 垃圾收集算法有多种,每种都有其特定的...
本文将深入探讨Java和C#中的垃圾回收算法,帮助开发者理解其工作原理和优化策略。 首先,我们要明确垃圾回收的基本概念。在程序运行过程中,会动态分配内存来存储对象。当一个对象不再被引用时,它就变成了垃圾。...
6. 实际应用分析:本研究通过理论分析与实践相结合的方式,探讨如何将优化后的垃圾收集算法应用到嵌入式Java虚拟机中,并分析算法实施前后的性能差异。这包括但不限于应用程序响应时间、吞吐量、内存占用等性能指标...
Java垃圾收集器是Java语言中的一个关键特性,它负责自动管理程序中的内存,尤其是对象的分配和回收。在一些编程语言中,如C++,在堆上分配对象可能需要较高的开销,但在Java中,由于垃圾收集器的存在,这个过程实际...
当前的Java虚拟机(JVM)中的垃圾收集机制已经相当成熟,其中包括多种不同的垃圾收集器和相应的算法。 文档接着介绍了垃圾收集算法的基础和实现。垃圾收集算法根据其处理的内存区域分为几个不同的种类,包括在年轻...
Java垃圾收集是Java编程中的一个核心概念,它关乎程序的性能和稳定性。这份"Java技术资料"中的"Java垃圾收集必备手册"很可能包含了关于Java内存管理、垃圾收集机制、垃圾收集器以及如何优化垃圾收集的一些关键知识点...
3. 分代收集算法:该算法将对象分为不同的代,然后根据对象的生命周期和使用频率,选择合适的垃圾回收算法。 Java垃圾回收机制的实现: 1. 垃圾回收器:垃圾回收器是Java虚拟机中的一个组件,负责垃圾回收的实现。...
这份"Java垃圾收集必备手册"涵盖了Java开发中关于垃圾收集的基本概念、工作原理以及优化策略,对于Java开发者来说是不可多得的学习资源。 一、垃圾收集基本概念 1. 内存管理:Java使用自动内存管理,程序员无需手动...