Java虚拟机-垃圾收集器

  垃圾收集器(Garbage Collection, GC)的诞生引导出了三个问题:

  哪些内存需要回收?

  什么时候回收?

  如何回收?

  对于线程独占的三个区域(程序计数器、虚拟机栈、本地方法栈)不用过多的考虑垃圾回收的问题,因为他们随着线程创建而生,随着线程结束而消失。然而Java堆和方法区则不一样,一个接口的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也不一样,我们只有在程序运行的的时候才知道会创建哪些对象,这部分的内存分配是动态的,所以这也是GC所关注的方面。

  如何判断对象已死  

  (1)引用计数法:给对象添加一个引用计数器,每当一个地方引用它,就加一,引用失效,就减1。引用计数法实现比较简单,判定效率也高,但是往往有这样一种情况,两个对象相互引用,除此之外别无它用,这样算不算垃圾对象?在经过验证之后发现,这样的对象也会被GC回收,因此我们可以判定,Java虚拟机的GC采用的并不是这种机制。

  (2)可达性分析法:这个算法的基本思想就是通过一系列的称为“GC Roots”的对象作为起始点,从这些结点开始向下搜索,搜索走过的路径称为引用链。当一个对象没有任何引用链相连时,我们可以得到这个对象是不可用的,于是这个对象会被判定是可回收的对象。

  生存还是死亡

  即时在可达性分析法中不可达的对象,也并非是“非死不可”的对象,这时候他们暂时处于一个“缓刑”状态,要想真正的宣告一个对象的死亡,至少经历两个标记过程:如果对象不可达,那么它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法,如果(1)没有这种方法(2)已经执行过这种方法,那么就可以看做“没有必要执行”。如果对象被判定有必要执行finalize方法,那么这个对象将会被放在一个叫F-Queue的队列之中,并在稍后由一个虚拟机自动建立、低优先级的Finalize线程去执行它。如果对象在这次处理中拯救了自己,和其他建立了联系,那么就会被移除“即将回收”集合。如果还是没有任何联系,那就会被真正回收掉。

  

  

原文地址:https://www.cnblogs.com/Jolivan/p/8437176.html

时间: 2024-11-07 19:24:49

Java虚拟机-垃圾收集器的相关文章

Java虚拟机垃圾收集器与内存分配策略

Java虚拟机垃圾收集器与内存分配策略 概述 那些内存需要回收,什么时候回收,如何回收是GC需要完成的3件事情. 程序计数器,虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性,内存随着方法结束或者线程结束就回收了. java堆与方法区在运行期才知道创建那些对象,这部分内存分配是动态的,本章笔记中分配与回收的内存指的就是:java堆与方法区. 判断对象已经死了 引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它,计数器+1;引用失败,计数器-1.计数器为0则改判

(转)《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器

Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK1.6中Sun HotSpot虚拟机的垃圾收集器如下: 图中如果两个垃圾收集器直接有连线,则表明这两个垃圾收集器可以搭配使用. (1).Serial垃圾收集器: Serial是最基本.历史最悠久的垃圾收集器,使用复制算法,曾经是JDK1.3.1之前新生代唯一的垃圾收集器. Serial是一个单线程的

Java虚拟机垃圾收集器

垃圾收集器用到的垃圾收集算法 标记-清除(Mark-Sweep)算法: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.它主要有两个缺点:一个是效率问题,标记和清楚过程的效率都不高:另外一个是空间问题,标记清楚后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够连续的内存空间而不得不提前出发另一次垃圾收集动作. 执行过程如下图所示: 复制算法: 它将可用内存按容量划分为大小相等的两块,每次只是用其中一块.当这一块的内存用

深入理解JAVA虚拟机 垃圾收集器和内存分配策略

引用计数算法 很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 客观地说,引用计数算法(Reference Counting)的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软的COM(Component Object Model)技术.使用ActionScript 3的FlashPlayer.Python语

深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾收集器与内存分配策略 Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题: 给对象分配内存; 回收分配给对象的内存. 对象的内存分配,往大方向上讲就是在堆上的分配,对象主要分配在新生代的Eden区上.少数也可能分配在老年代,取决于哪一种垃圾收集器组合,还有虚拟机中的相关内存的参

[深入理解Java虚拟机]<垃圾收集器与内存分配策略>

Overview 垃圾收集考虑三件事: 哪些内存需要回收? 什么时候回收? 如何回收? 重点考虑Java堆中动态分配和回收的内存. Is Object alive? 引用计数法 给对象添加一个引用计数器. 该方法实现简单,判定效率高.但是它很难解决对象之间相互循环引用的问题,因此几乎很少有JVM选用该方法.eg: public class ReferenceCountingGC { public Object instance = null; // 占点内存,以便在GC日志中看清楚是否被回收过

深入JVM读书笔记(四)——Java的垃圾收集器

垃圾收集器: Java的垃圾回收机制最主要的实现者就是”垃圾收集器”,但是每个厂商设计的虚拟机所提供的垃圾收集器都有很大区别,而且即使是同一个虚拟机也会提供几个不同的垃圾收集器供用户根据自己不同特点来组合.下图是Hot Spot虚拟机包含的收集器,之后介绍每个收集器的特点. 在介绍各种收集器之前,先确认一下并行和并发的概念:(下面是指垃圾收集器的语境中) l  并行(Parallel):多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. l  并发(Concurrent):用户线程和垃圾

深入理解 Java G1 垃圾收集器--转

原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象. 垃圾回收的基本步骤 回收的步骤有2步: 查找内存中不再使用的对象 释放

Java虚拟机 垃圾收集算法及HotSpot算法实现

垃圾收集算法 一般来说,垃圾收集算法分为四类: 标记-清除算法 最基础的算法便是标记-清除算法(Mark-Sweep).算法分为“标记”和“清除”两个阶段:首先标记处需要收集的对象,在标记完成之后,再统一回收所有被标记的对象. 这是最简单的一种算法,但是缺点也是很明显的:一个是效率问题,标记和清除效率都不高.二是空间问题,清除之后会产生大量的空间碎片,导致之后分配大对象找不到足够的连续对象而不得不触发另一次垃圾收集动作.算法执行过程如下图. 复制算法 复制算法(Copying)将可用内存按照容量