`
huze104
  • 浏览: 97556 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java垃圾回收算法

    博客分类:
  • JAVA
阅读更多

垃圾回收算法有两个基本的问题:1.必须检测到垃圾对象。2.必须重新声明被垃圾对象占用的堆空间并且让堆空间可用。

  可达性(reachability)

  一个对象是可达的,当且仅当从可执行程序的根集开始有引用路径能访问该对象。

  根集(roots set)

  包括:1.局部变量的对象引用,栈元素以及任何类变量的对象引用

        2.任何对象引用,如string

        3.任何传递给本地方法的对象引用

        4.JVM的运行时数据区的任何部分

 

  引用记数(reference counting)

  这是一种不使用根集的垃圾回收算法。基本思想是:当对象创建并赋值时该对象的引用计数器置1,每当对象给任意变量赋值时,引用记数+1;一旦退出作用域则引用记数-1。一旦引用记数变为0,则该对象可以被垃圾回收。

  引用记数有其相应的优势:对程序的执行来说,每次操作只需要花费很小块的时间。这对于不能被过长中断的实时系统来说有着天然的优势。

  但也有其不足:不能够检测到环(两个对象的互相引用);同时在每次增加或者减少引用记数的时候比较费时间。

  在现代的垃圾回收算法中,引用记数已经不再使用。

  追踪算法(tracing)

  基于根集的最基本算法。基本思想是:每次从根集出发寻找所有的引用(称为活对象),每找到一个,则对其做出标记,当追踪完成之后,所有的未标记对象便是需要回收的垃圾。

  追踪算法基于标记并清除.这个垃圾回收步骤分为两个阶段:在标记阶段,垃圾回收器遍历整棵引用树并标记每一个遇到的对象。在清除阶段,未标记的对象被释放,并使其在内存中可用。

  紧凑算法(compacting)

  在追踪算法中,每次被释放的对象会让堆空间出现碎片,这会使得内存的页面管理变得非常不稳定,可能在还有足够内存空间时就发生溢出,这对于本来就紧张的JVM内存资源来说是非常不利的。由此出现了紧凑算法。

  基本思想是:在追踪算法进行垃圾回收的基础上,每次标记清扫时顺便将对象全部整理到内存的一端,这样每次分配内存时便都能从顺序的空间开始。每次更新时,对象句柄都指向实际的对象,所有参考他的引用都将通过参考对象句柄来得到对象的实际位置。

  拷贝算法(copying)

  这是另一种针对内存碎片的算法。基本思想是:将内存划分为两块,一块是当前正在使用;另一块是当前未用。每次分配时使用当前正在使用内存,当无可用内存时,对该区域内存进行标记,并将标记的对象全部拷贝到当前未用内存区,这是反转两区域,即当前可用区域变为当前未用,而当前未用变为当前可用,继续执行该算法。

  拷贝算法需要停止所有的程序活动,然后开始冗长而繁忙的copy工作。这点是其不利的地方。

  分代算法(geneational)

  针对拷贝算法的不足,有的最新JVM采用了分代算法。其思想依据是:

  1.被大多数程序创建的大多数对象有着非常短的生存期。

  2.被大多数程序创建的部分对象有着非常长的生存期。

  简单拷贝算法的主要不足是它们花费了更多的时间去拷贝了一些长期生存的对象。

  分代算法的基本思想是:将内存区域分两块(或更多),其中一块代表年轻代,另一块代表老的一代。针对不同的特点,对年轻一代的垃圾收集更为频繁,对老代的收集则较少,每次经过年轻一代的垃圾回收总会有未被收集的活对象,这些活对象经过收集之后会增加成熟度,当成熟度到达一定程度,则将其放进老代内存块中。

  分代算法很好的实现了垃圾回收的动态性,同时避免了内存碎片,是目前许多JVM使用的垃圾回收算法。

  适应算法(adaptive)

  其主要思想是:在不同的条件下采用不同的回收算法。即动态改变垃圾回收策略。该算法对于垃圾回收的适应性和灵活性有着非常好的调整。

分享到:
评论

相关推荐

    java虚拟机垃圾回收算法

    这是一篇关于java虚拟机垃圾回收算法的论文。

    Java垃圾回收算法的简易模拟实现.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    java C#垃圾回收算法分析

    这是关于java C#垃圾回收算法分析,可以参考

    老生常谈java垃圾回收算法(必看篇)

    下面小编就为大家带来一篇老生常谈java垃圾回收算法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java垃圾回收知识,垃圾回收资料

    重要性:垃圾回收是Java垃圾回收器的核心功能,对性能和内存管理至关重要。准确理解垃圾回收的原理和机制,以及能够优化和调优垃圾回收过程的能力,是一个Java开发者必备的基本技能。 面试中可能会问到的垃圾回收...

    Java垃圾回收机制总结

    Java垃圾回收机制总结 Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 ...

    Java垃圾回收机制

    关于Java垃圾回收机制 垃圾收集的算法分析 垃圾回收的几个特点

    论文研究-嵌入式Java虚拟机的垃圾回收算法的研究 .pdf

    嵌入式Java虚拟机的垃圾回收算法的研究,刘健培,,在嵌入式系统中,需要分析什么样的垃圾回收机制能够适应嵌入式系统的特点,满足系统对于稳定性和性能的要求。本文阐述了嵌入式Jav

    Java垃圾回收新算法刍探.pdf

    Java垃圾回收新算法刍探

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

    垃圾回收算法是Java虚拟机(JVM)中的一种机制,用于回收无用的对象以释放内存空间。垃圾回收算法可以从不同的角度划分,下面是常见的垃圾回收算法: 1. 引用计数(Reference Counting) 引用计数是一种古老的垃圾...

    垃圾回收相关算法.pdf

    资源描述: 1.JVM中[垃圾回收相关算法]的所有内容-pdf 2.资源内容:JVM中[垃圾回收相关算法]所有内容 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开

    java垃圾回收机制

    java垃圾回收机制核心算法

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

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

    Java+JVM+垃圾回收机制

    该资源通过图像及文字详细分析回答了JVM垃圾...图画详细介绍常见的三种垃圾回收算法,包括标记-清除算法、标记-整理算法和标记-复制算法。 3.垃圾回收的具体流程是怎样的? 图画分析介绍垃圾回收机制额分区和算法过程

    Java垃圾回收GC机制

    Java垃圾回收GC机制 Java垃圾回收GC机制是Java虚拟机(JVM)中的一种自动内存管理机制,它主要是为了解决Java程序中的内存问题。GC机制的出现使得Java程序员不再需要手动管理内存,提高了开发效率和程序的稳定性。 ...

    Java 垃圾回收新算法刍探

    由Java语言与C/C++对象在内存管理方式的不同,引出了Java语言的优势技术——垃圾...通过对GC工作原理的阐述及对一些传统的垃圾收集器的分析,提出了一种新的垃圾处理算法,一定程度上改善和提高了Java垃圾处理的性能。

    Java垃圾回收机制算法详解

    主要介绍了Java垃圾回收机制算法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了.docx

    * Java垃圾回收算法有标记-清除、标记-压缩、复制等多种,垃圾回收的触发条件包括对象不可达、对象的finalize方法调用完毕等 4. Java中的Error和Exception * Error表示JVM的错误,例如系统崩溃、虚拟机错误等,...

    深入理解JVM垃圾收集算法与垃圾收集器

    深入理解JVM垃圾收集算法与垃圾收集器

Global site tag (gtag.js) - Google Analytics