虚拟机学习四-垃圾回收机制

重点关注几个问题:

-对象已死吗?

采用引用计数法(不能解决相互循环引用问题)或可达性分析法。

引用计数法:计算对象的引用数,计数为0时对象被回收。

可达性分析:通过一系列的"GC Roots"的对象(如栈中引用的对象、方法区中类静态属性引用的对象、常量引用的对象)作为起始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(不可达),则这些对象时不可用的。

-方法区中的回收

主要针对废弃的"常量"(程序中没有对象叫做“ab”,那常量池中"ab"将会被回收)和无用的类进行回收。

所谓无用的类,必须满足以下条件:

1、堆中不存在该类的任何实例2、加载该类的类加载器已经被回收3、该类对应的Class对象没有在任何地方被引用,即无法再任何地方通过反射访问该类的方法。

在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成jsp这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载功能以保证不会发生内存溢出。(至于类是否会被虚拟机回收,需要设置虚拟机参数-Xnoclassgc,以上三点只是必要条件)

时间: 2024-10-13 21:21:45

虚拟机学习四-垃圾回收机制的相关文章

【JVM】(四) :垃圾回收机制(GC)

垃圾的标准 对象被判定为垃圾的标准: 没有被其他对象引用 判断对象是否为垃圾的算法: 引用计数算法 可达性分析算法 引用计数算法 判断对象的引用数量: 通过判断对象的引用数量来决定对象是否可以被回收 每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1 任何引用计数 为0的对象实例可以被当作垃圾收集 代码示例 public void ReferenceQuoteCounterProblem(){ MyObject object1 = new MyObject(); //(1) count

java基础学习之垃圾回收机制

回收过程: 1.发现无用的对象 2.回收无用对象占用的内存的空间. 垃圾回收相关算法: 1.引用计数法 堆中每个对象都有一个引用计数.被引用一次,计数加一.被引用变量值变为null,则计数减一. 到计数变为0,则表示为无用对象. 优点:算法简单 缺点:无法识别循环引用(相互引用对方,导致计数器不为0,但实际上已经不用它们了) 2.引用可达法(根搜索算法) 通过一系列的GC Roots的对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对

初步学习-----C#垃圾回收机制

原文地址:http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=206721898&idx=1&sn=dfaee0ae6fa092b1a6db5779d75c0a2d&scene=5#rd 下面是本菜鸟对上述大神文章简单总结,当然还有许多不足之处,希望大家还是看上面链接中的文章较好! 一基本原理: 计算机内存大致分为两种:栈和堆.C#中分为两种类型:值类型和引用类型.其中值类型主要存储在栈区(栈的机制实际通过类似链表实现的

Java学习之垃圾回收机制

垃圾回收机制,依赖JRE和JVM,涉及操作系统中内存的分配与回收.依据所学,我猜想这种机制需要的数据结构是堆内存分配表(链),管理已分配和未分配的堆内存,对于已分配堆内存,需要知道由栈内存中的哪些变量引用.知道了这些,依赖垃圾检测和回收算法,把长期未得到栈变量引用的堆内存块回收,挂到未分配内存表中.清理完成后可能会进行碎片整理,相应地修改分配表. 垃圾检测和回收算法,会随着Java版本.操作系统不同而不同.而且垃圾检测和回收算法可以手动选择. 原文地址:https://www.cnblogs.c

Java虚拟机(JVM)与垃圾回收机制(GC)的详解

一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中.(右图表示了从java源文件到JVM的整个过程,可配合理解. 关于类的加载机制,可以参考http://blog.csdn.net/tonytfjing/article/details/47212291) 2.执行引擎:负责执行class文件中包含的字节码指令(执行引擎的工作机

Java垃圾回收机制学习心得

本文章是我在学习Java垃圾回收机制中总结的知识点的整理,在此特别感谢http://www.cnblogs.com/andy-zcx/p/5522836.html和http://blog.csdn.net/zsuguangh/article/details/6429592的博客. 内存泄漏:内存泄漏是指内存空间使用完毕后未进行回收操作.一般来说,Java中的内存泄漏是因为内存对象生命周期超出其在程序中存在的时间长度 垃圾回收意义:解决编程时需要考虑的内存管理问题,有效解决内存泄漏问题,充分利用空

深入解析Java垃圾回收机制

引入垃圾回收 哪些内存需要回收? 引用计数法 可达性分析 如何回收 Marking 标记 Normal Deletion 清除 Deletion with Compacting 压缩 为什么需要分代收集? JVM的分代 新生代 老年代 永久代 分代垃圾收集过程详述 引入垃圾回收 程序计数器. 虚拟机栈. 本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作. 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由JIT编译

Java虚拟机垃圾回收机制

在Java虚拟机中,对象和数组的内存都是在堆中分配的,垃圾收集器主要回收的内存就是再堆内存中.如果在Java程序运行过程中,动态创建的对象或者数组没有及时得到回收,持续积累,最终堆内存就会被占满,导致OOM. JVM提供了一种垃圾回收机制,简称GC机制.通过GC机制,能够在运行过程中将堆中的垃圾对象不断回收,从而保证程序的正常运行. 垃圾对象的判定 我们都知道,所谓“垃圾”对象,就是指我们在程序的运行过程中不再有用的对象,即不再存活的对象.那么怎么来判断堆中的对象是“垃圾”.不再存活的对象呢?

Java虚拟机--垃圾回收机制

Java与C++相比,具有动态分配内存和垃圾回收机制的技术优势,使得我们不用把精力集中在内存的管理上,那我们为什么还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存溢出.内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些"自动化"的技术实施必要的监控和调节. 1.为什么进行垃圾回收  随着程序的运行,系统内存中存在的对象实例.各种变量越来越多,如果不进行垃圾回收,会影响到程序的性能,当占用内存过多时,还会产生OOM等系统异常. 2.哪些内存需要回收 关于