JVM垃圾收集 GC 简介

垃圾收集 GC (Gardage Collection)


程序计数器 虚拟机栈 本地方法栈 随进程而生 随进程而灭GC在对堆进行回收钱第一件事是要确定这些对象哪些还在“存活”状态而哪些已经“死去”(不能在被引用的对象)


引用计数法


很多判断对象是否存活的算法是这样的 在对象中添加一个引用计数器 没当有一个地方引用时 计数器 +1 当失效时 -1 任何时刻计数器都为0 的对象是不可能在被使用的GC不是通过引用计数法来判断对象是否存活的

根搜索算法


目前主流的商用程序语言中 (JAVA C# Lisp等)都是使用的根搜索算法(GC Roots Tracing) 判断对象的存活搜索根算法基本思路是 通过一系列命名为GC Roots的对象作为起点 从这些节点向下搜索 搜索所凑过的路径称为 引用链(Reference Chain) 当一个对象到GC Roots没有任何引用链向链 用图论的话来说就是GC Roots到达这个对象不可能时 则证明此对象不可用


Java中可作为GC Roots的对象有 
1.虚拟机栈 (栈帧中本地变量表)中引用的对象
2.方法区类的静态属性引用的对象
3.方法区中常量引用的对象
4.本地方法栈中JVI (就是一般的Native方法)的引用对象

引用 


JDK 1.2 之前Java中的引用是定义很传统的 如果 reference 类型的数据中存储的数值代表的是另一块内存其实的地址 这块内存就代表一个引用在 JDK 1.2 之后 Java对引用这个概念进行了扩充将引用分为


1.强引用 
Object obj = new Object(); 这就是强引用 只要强引用还存在GC永远不会回收掉呗引用的对象。
2.软引用 
并非必需对象 在系统存在内存溢出之前就会把 这些对象列近回收范围之中第二次回收 如果还是没有足够内存才会抛出异常 SoftReference 类用来实现软引用
3.弱引用 
在下次垃圾回收发生之后无论内存是否够用弱引用都会被回收掉 weakReference类用来实现弱引用
4.虚引用 
虚引用在引用过对象后自动消失 PhantomReference 类来实现虚引用

finalize
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。在根搜索法中不可达的对象 并不是直接就被清理掉  这时候会被GC标记 至少要经历两次标记过程 才能宣告 这个类或者内存对象的死亡 任何一个对象的finalize()都只会被系统自动调用一次  如果对象面临下一次回收那么finalize()就不会被执行
Finaize方法能做的所有工作 使用try-finally 或者其他方式都可以做的更好


回收方法区
永久代(方法区)收集的主要两部分 废弃常量 和 无用的类废弃常量假如一个字符串“abc”进入常量池中 但是当前没有任何一个String 对象叫abc  该abc也没有其他任何String对象引用的话 并且在这时发生内存回收 而且必要的话abc这个常量就会被系统请出常量池  常量池中其他类的借口方法字段和此方法类似


无用类

判定无用类要满足三个方法
1.该类已被所有实例回收 也就是JAVA堆中不存在该类的任何实例
2.加载类已经被ClassLoder(类加载器)回收
3.该类对于java.lang.Class 对象没有在任何地方被引用 无法再任何地方通过反射访问该类的方法的方法都被认定为无用类 虚拟机会对满足上述三个条件的类进行回收 大量使用反射 动态代理 CGlib bytecode框架的场景以及动态生成JSP 和 OSGi这类频繁定义ClassLoder的场景都需要虚拟机具备类卸载功能 以保证永久代不会溢出
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值