展开

关键词

Java垃圾回收机制详解(面试题

Java垃圾回收,主要是针对JVM内存中的堆空间。 一,对象是否可被回收的判断方法 1,引用计数法 每个对象都有一个引用计数器,当对象被引用一次计数器就加 1;当引用失效时计数器就减 1。 二,垃圾收集算法 1,标记-清除算法 最基础的收集算法是“标记-清除”(Mark-Sweep)算法,分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 内存的分配担保也一样,如果另外一块 Survivor 空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代。 (Region),G1收集器之所以能建立可预测的停顿时间模型,是因为它可以有计划的避免在整个Java堆中进行全区域的垃圾收集。 G1跟踪各个Region里垃圾堆积的价值大小(回收所获得的空间大小以及回收所需要的时间的经验值),在后台维护一个优先列表,每次优先收集价值最大的那个Region。

1.8K20

Java垃圾回收机制

Java垃圾回收机制Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。 垃圾回收的算法分析 Java语言规范没有明确地说明JVM使用哪种垃圾回收算法,但是任何一种垃圾回收算法一般要做2件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用 大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就是正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。 垃圾回收首先需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾回收,这也包括从根集间接可达的对象。 除了强引用外,其他都可以在java.lang.ref包中找到他们的身影。 强引用的对象是可初触及的,不会被回收。其他三个是软可触及,弱可触及,虚可触及,在一定条件下是可以被回收的。

56250
  • 广告
    关闭

    腾讯云校园大使火热招募中!

    开学季邀新,赢腾讯内推实习机会

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java垃圾回收原理与机制并未改变 (3)Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。 详解Java GC的工作原理 概要: JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,另外JVM分别对新生代和旧生代采用不同的垃圾回收机制。 1. 介绍完了JVM内存组成结构,下面我们再来看一下JVM垃圾回收机制。 2. JVM垃圾回收机制 JVM分别对新生代和旧生代采用不同的垃圾回收机制 新生代的GC: 新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中

    34150

    面试题:讲讲Java垃圾回收机制

    一、垃圾回收机制的意义   JVM 内存模型一共包括三个部分:堆 ( Java代码可及的 Java堆 和 JVM自身使用的方法区)、栈 ( 服务Java方法的虚拟机栈 和 服务Native方法的本地方法栈 另外,我们知道垃圾回收机制Java语言一个显著的特点,其可以有效的防止内存泄露、保证内存的有效使用,从而使得Java程序员在编写程序的时候不再需要考虑内存管理问题。 (三种经典垃圾回收算法(标记清除算法、复制算法、标记整理算法)及分代收集算法 和 七种垃圾收集器)   在探讨Java垃圾回收机制之前,我们首先应该记住一个单词:Stop-the-World。 需要注意的是,Java垃圾回收机制Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。 Java中的内存泄露问题   虽然Java拥有垃圾回收机制,但同样会出现内存泄露问题,比如下面提到的几种情况:   (1).

    1.1K20

    Java垃圾回收机制

    哪些内存需要回收? 哪些内存需要回收垃圾回收机制第一个要考虑的问题,所谓“要回收垃圾”无非就是那些不可能再被任何途径使用的对象,那么如何找到这些对象? 在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。Java中的类SoftReference表示软引用 弱引用 描述非必需对象。 被弱引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。 Java中的类PhantomReference表示虚引用 (2)方法区回收 虚拟机规范中不要求方法区一定要实现垃圾回收,而且方法区中进行垃圾回收的效率也确实比较低,但是HotSpot对方法区也是进行回收的 (3)垃圾回收算法 第一步考量了哪些对象进行回收后,第二步自然是如何对对象进行回收了。这里主要写几种垃圾回收算法的思想。

    10540

    Java 垃圾回收机制

    什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。 而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。 第一步:标记 垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。 ? 为什么需要分代垃圾收集? 之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。 来看个例子吧。 Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。 此外,Java SE类库和方法也存储在这里。 如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收

    31240

    java垃圾回收机制

    一.简介 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。 而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。 二.具体步骤 第一步:标记垃圾回收的第一步是标记。 垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。 上图中,蓝色表示已引用对象,橙色表示未引用对象。垃圾回收器要检查完所有的对象,才能知道哪些有被引用,哪些没。 为什么需要分代垃圾收集?之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。 此外,Java SE类库和方法也存储在这里。 如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收

    9220

    JAVA垃圾回收机制

    垃圾回收机制的所有信息和资料都是来源于oracle公司对外开放的一些文档,这也是大家不管在哪里看到垃圾回收机制都差不多的原因,这些信息属于JVM公开的文档。 ? 程序的任何部分都不再引用未使用的对象或未引用的对象,因此可以回收未引用对象使用的内存。 像C这样的编程语言中,分配和释放内存是一个手动过程。在java中,接触分配内存的过程由垃圾收集器自动处理。 老年代:老年代中使用“标记-清除”或者“标记-整理”算法进行垃圾回收回收次数相对较少,每次回收时间比较长。 收集器在工作时,会调整Java堆大小或者其他参数,尽可能把停顿时间控制在MaxGCPauseMillis以内。 -XX:GCTimeRatio:设置吞吐量大小。它是0-100的整数。 (五)垃圾回收器集合 介绍了7种垃圾回收器,有作用在新生代,也有作用在老年代的。也有G1两者都可以兼容的,G1已经基本大规模使用了。

    19710

    图解 Java 垃圾回收机制

    什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。 而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。 第一步:标记 垃圾回收的第一步是标记。 垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。 ? 为什么需要分代垃圾收集? 之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。 来看个例子吧。 Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。 此外,Java SE类库和方法也存储在这里。 如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收

    22420

    图解 Java 垃圾回收机制

    /translate/java-gc 翻译:Rhys_Lee, AzureSora, 溪边九节, 小小菜鸟鸡 什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。 而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。 第一步:标记 垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。 ? 为什么需要分代垃圾收集? 之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。 来看个例子吧。 此外,Java SE类库和方法也存储在这里。 如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收

    28110

    JAVA垃圾回收机制 - GC

    OOM,你好 听说面试的java的人,总会被问你懂JVM么,知道垃圾回收机制么,进行过高并发编程么。 自己在开发过程中也会遇到java.lang.OutOfMemoryError这样的错误,简称内存溢出OOM。 OOM出现的原因归根结底就是运行Java程序的堆内存满了,jvm就开始清理垃圾,又因为可清理的垃圾很少,内存还是不够用,或者基本上没有垃圾,导致程序没有内存可以用了,只能通过OOM宣布自己崩了。 其实不然,当对象无法回收的时候在某一时刻还是会OOM。那到底什么是可回收,什么无法回收。 谁是垃圾 垃圾的真实面目还是对象。只是用完了没人再用了就变成了垃圾。 不吹不黑,U1S1,垃圾回收器用G1就行 GC类型:JVM将heap(堆,就是内存)分为了新生代、老年代,各个代清理垃圾的时候都有自己的行动代号 回收算法:垃圾回收器对应了各自的回收算法。

    7520

    Java垃圾回收机制详解

    #概述 由于JVM中垃圾收集器的存在,使得Java程序员在开发过程中可以不用关心对象创建时的内存分配以及释放过程,当内存不足时,JVM会自动开启垃圾收集线程,进行垃圾对象的回收。 那么垃圾回收线程到底是什么时候触发,并如何实现垃圾回收的呢?本文将对openjdk的源码进行分析,并通过代码分析Java垃圾回收的过程。 Java gc触发 在Java的内存分配机制中,当新生代不足以分配对象所需的内存时,会触发一次YGC,具体实现如下: ? 到这一步才开始真正的gc操作:设置当前内存代的_saved_mark值,即设置这些内存区域块的上限地址;通过每个内存代管理器的collect方法对垃圾对象的进行回收垃圾收集算法的具体细节会在后文进行分析 到此Java jvm垃圾回收进程就终止gc进程。

    51280

    图解Java 垃圾回收机制

    垃圾回收机制的引入可以有效的防止内存泄露、保证内存的有效使用,也大大解放了Java程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理。 ---- 友情提示:   为了更好地了解Java垃圾回收机制,笔者建议读者先要对JVM内存模型有一个整体的了解和把握。 (三种经典垃圾回收算法(标记清除算法、复制算法、标记整理算法)及分代收集算法 和 七种垃圾收集器) ----   在探讨Java垃圾回收机制之前,我们首先应该记住一个单词:Stop-the-World。 需要注意的是,Java垃圾回收机制Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。 Java中的内存泄露问题   虽然Java拥有垃圾回收机制,但同样会出现内存泄露问题,比如下面提到的几种情况:   (1).

    37720

    Java垃圾回收的终结机制

    (1) 如果可终结的对象不可达了,会在内部终结队列中放一个引用,指向这个对象;而且,为了回收垃圾,这个对象会被标记为“存活”。 (4) 因此,调用 finalize() 方法后,垃圾回收子系统在回收对象之前,必须重新判断对象是否可达。 (5) 不过,就算对象复活了,也不会再次调用终结方法。

    13410

    Java垃圾回收机制(转)

    说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。 顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?   在确定了哪些垃圾可以被回收后,垃圾收集器要做的事情就是开始进行垃圾回收,但是这里面涉及到一个问题是:如何高效地进行垃圾回收。 由于Java虚拟机规范并没有对如何实现垃圾收集器做出明确的规定,因此各个厂商的虚拟机可以采用不同的方式来实现垃圾收集器,所以在此只讨论几种常见的垃圾收集算法的核心思想。    当然分配的规则并不是百分之百固定的,这要取决于当前使用的是哪种垃圾收集器组合和JVM的相关参数。   参考资料:   《深入理解Java虚拟机》

    22031

    Java垃圾回收(GC)机制详解

    一、为什么需要垃圾回收   如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。 二、哪些内存需要回收? 哪些内存需要回收垃圾回收机制第一个要考虑的问题,所谓“要回收垃圾”无非就是那些不可能再被任何途径使用的对象。那么如何找到这些对象? 被弱引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。Java中的类WeakReference表示弱引用。 四、方法区的垃圾回收 方法区的垃圾回收主要回收两部分内容:1. 废弃常量。2. 无用的类。既然进行垃圾回收,就需要判断哪些是废弃常量,哪些是无用的类。 如何判断废弃常量呢? 该类的所有实例都已经被回收,即Java堆中不存在该类的任何实例。 2. 加载该类的ClassLoader已经被回收。 3.

    20030

    Java垃圾回收(GC)机制专题

    存活的对象不会被垃圾回收回收;死亡的对象是应用不可访问而且还没有被垃圾回收回收的对象,等下一个周期回收。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收Java虚拟机就会把这个弱引用加入到与之关联的引用队列。 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射机制访问该类的方法。 一般将Java堆分为新生代和老年代这样就可以根据各个年代的特点选择合适的垃圾收集算法。

    8650

    图解 Java 垃圾回收机制

    1、什么是自动垃圾回收? 自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。 而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍垃圾回收机制的基本过程。 第一步:标记 垃圾回收的第一步是标记。垃圾回收器此时会找出哪些内存在使用中,还有哪些不是。 ? 3、为什么需要分代垃圾收集? 之前说过,逐一标记和压缩 Java 虚拟机里的所有对象非常低效:分配的对象越多,垃圾回收需时就越久。不过,根据统计,大部分的对象,其实用没多久就不用了。 Stop the World 事件 —— 小型垃圾回收属于一种叫 "Stop the World" 的事件。 此外,Java SE类库和方法也存储在这里。 如果JVM发现某些类不再需要,并且其他类可能需要空间,则这些类可能会被回收

    21830

    扫码关注腾讯云开发者

    领取腾讯云代金券