1、引用计数(reference counting)
原理:此对象有一个引用,则+1;删除一个引用,则-1。只用收集计数为0的对象。
缺点:无法处理循环引用的问题。如:
对象A和B分别有字段b、a,令A.b=B和B.a=A,除此之外这2个对象再无任何引用,那实际上这2个对象已经不可能再被访问,但是引用计数算法却无法回收他们。
2、复制(copying)
原理:把内存空间划分为2个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另外一个区域。
优点:不会出现碎片问题。
缺点:1、暂停整个应用。2、需要2倍的内存空间。
3、
标记-清扫(Mark-and-sweep)---
sun前期版本就是用这个技术
原理:对于“活”的对象,一定可以追溯到其存活在堆栈、静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。第一阶段:从GC roots开始遍历所有的引用,对有活的对象进行标记。第二阶段:对堆进行遍历,把未标记的对象进行清除。这个解决了循环引用的问题。
缺点:1、暂停整个应用;2、会产生内存碎片。
4、
标记-压缩(Mark-Compact)自适应
原理:第一阶段标记活的对象,第二阶段把为标记的对象压缩到堆的其中一块,按顺序放。
优点:1、避免标记扫描的碎片问题;2、避免停止复制的空间问题。
具体使用什么方法GC,Java虚拟机会进行监视,如果所有对象都很稳定,垃圾回收器的效率低的话,就切换到“标记-扫描”方式;同样,Java虚拟机会跟踪“标记-扫描”的效果,要是堆空间碎片出现很多碎片,就会切换回“停止-复制”模式。这就是自适应的技术。
5、分代(generational collecting)-----
J2SE1.2以后使用此算法
原理:基于对象生命周期分析得出的垃圾回收算法。把对象分为年轻代、年老代、持久代,对不同的生命周期使用不同的算法(2-3方法中的一个即4自适应)进行回收。
如上图所示:为Java的各代分布图
年轻代(young)
分为3个区。一个Eden区,2个survivor区。大部分对象在Eden中生成。当Eden区满时,还存活的对象将被复制到survivor区。当该survivor区满时,此区的存活对象被复制到另外一个survivor区,当第2个survivor区也满时,该区还存活的对象将被复制到年老区(tenured)。
年老代(tenured)
存放从年轻代(young)复制过来的对象。
持久代(perm)
用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著的影响,但是有些应用可能动态生成或者调用一些class。持久代大小通过
-XX:MaxPermSize=N进行设置
Thinking in java给java gc取了一个罗嗦的称呼:“自适应、分代的、停止-复制、标记-扫描”式的垃圾回收器。
导致Gc的情况:
1、tenured被写满
2、perm被写满
3、System.gc()的显式调用。
4、上一次GC之后heap的各域分配策略动态变化。
分享到:
相关推荐
这是一篇关于java虚拟机垃圾回收算法的论文。
Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。
本文将深入探讨Java和C#中的垃圾回收算法,帮助开发者理解其工作原理和优化策略。 首先,我们要明确垃圾回收的基本概念。在程序运行过程中,会动态分配内存来存储对象。当一个对象不再被引用时,它就变成了垃圾。...
老生常谈java垃圾回收算法 Java垃圾回收算法是Java虚拟机(JVM)中的一种自动内存管理机制,它可以自动将无用的对象从内存中删除,从而避免内存溢出和提高系统性能。java垃圾回收算法有多种,包括引用计数法、Mark-...
本文提出了一种新的垃圾回收算法,该算法可以一定程度上改善和提高Java垃圾回收的性能。 Java与C/C++的对比: 1. 内存管理机制:Java中的内存管理机制基于垃圾回收机制,而C/C++中的内存管理机制基于手动管理。 2....
Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...
### Java垃圾回收详解 #### 垃圾回收基础概念 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地...
在Java虚拟机(JVM)中,垃圾回收(Garbage Collection, GC)是自动管理内存的重要机制,它负责识别并释放不再使用的对象所占用的内存空间。...理解这些基础的垃圾回收算法有助于我们更好地调试和调优Java应用程序。
Java垃圾回收机制总结 Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 ...
### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:Java虚拟机管理的内存主要分为以下几个部分: - **方法区(Method Area)**:存储类的信息(如类名、字段、方法等)、常量、...
垃圾回收算法篇详细介绍了多种垃圾回收算法,包括标记-清除算法、引用计数法、复制算法、标记-压缩算法、保守式垃圾回收、分代垃圾回收、增量式垃圾回收和RCImmix算法等。这些算法各有其特点和适用场景,它们是垃圾...
在这个主题中,Turing垃圾回收算法是一个重要的研究方向,它在Java等语言的虚拟机实现中扮演着关键角色。 垃圾回收(Garbage Collection, GC)是编程语言中的一种机制,用于自动管理程序的内存。它自动检测和回收...
Java垃圾回收机制是Java编程中一个非常重要的概念,尤其在面试和实际开发中常常被讨论。垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存...
### Java垃圾回收原理详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制是确保程序高效运行的关键技术之一。本文将深入探讨Java中的垃圾回收机制,包括其基本原理、不同类型...
通过深入理解JVM内存模型以及不同的垃圾回收算法,可以帮助我们更好地优化程序性能,提高代码质量。在实际开发过程中,合理利用JVM提供的工具和技术,可以有效地避免内存泄漏等问题,提升系统的稳定性和可靠性。
### Java垃圾回收机制详解 #### 一、Java垃圾回收机制概览 Java作为一种现代的、面向对象的编程语言,其一大特色就是引入了自动垃圾回收机制。这一特性极大地简化了开发人员的工作,使得他们不再需要手动管理内存...
### Java垃圾回收机制详解 #### 一、垃圾收集的意义及背景 在计算机编程领域,特别是对于内存管理方面,Java提供了一种与C++等其他语言截然不同的方式。在C++中,对象所占用的内存资源需要程序员手动管理,这意味...