GC在堆和方法区的内存回收

原创 2016年07月31日 20:47:35

堆对象的存活

判断对象是否存活,主流实现是可达性分析。 

可达性算法的基本思路,通过一系列为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain), 当一个对象到GC Roots 没有任何引用链相连时,相当于图论的从GC Roots不可达,则这个对象不可用。

  • 引用类型
    • 强引用
      只要强引用还存在,垃圾收集器永远不会收掉被引用的对象
    • 软引用
      在系统将要发生内存异常之前,将会把这些对象列进回收范围之中进行第二次回收。
    • 弱引用
      被弱引用关联的对象只能生存道下一次垃圾收集发生之前。
    • 虚引用
      一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。

对象的回收过程

当对象没有覆盖finalize方法,或者fialize已经被虚拟机调用过, 则是没必须要执行

Created with Raphaël 2.1.0分析对象对象不可达需要执行finalize方法放入F-Queue队列,由Finalizer线程去执行它回收这个对象存活(不回收)yesnoyesno

回收方法区

 方法区即为永久代,主要回收两部分内容:废弃常量和无用类。

满足以下3个条件的类称之为无用类

  • 该类所所有的对象实例已经被回收,也就是java堆中不存在该类的任何实例
  • 加载该类的ClassLoader已经被回收
  • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGI这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久带不会溢出。

版权声明:本文为博主原创文章,未经博主允许不得转载。

方法区的垃圾回收

很多人以为方法区(或者HotSopt VM中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且性价比一般较低,在对的新生代生一般能回收70%~95%的空...
  • hutongling
  • hutongling
  • 2017年04月01日 17:04
  • 838

JVM回收方法区

很多人习惯称方法区为永久代(hotspot以永久代来实现方法区) java虚拟机规范中提到:可以不要求虚拟机在方法区实现垃圾收集。而且在方法区的垃圾回收“性价比”一般比较低。在堆中,尤其是在...
  • he523160876
  • he523160876
  • 2016年08月26日 21:05
  • 835

七、对方法区的回收

永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。1、废弃的常量       假如一个字符串已经进入常量池,若当前系统中没有任何一个String对象,也就是没有任何String对象引用该常量,并...
  • lp1791803611
  • lp1791803611
  • 2016年11月22日 11:50
  • 157

JVM 方法区回收小结

JVM 方法区回收小结方法区也会发生垃圾回收,只是效率和性价比较低。回收主要分为两部分内容:废弃常量和无用的类。废弃常量的回收这与堆中对象的回收类似。以常量池的字符串为例,如果没有任何对象引用了此字符...
  • FIRE_TRAY
  • FIRE_TRAY
  • 2016年05月02日 20:23
  • 411

JVM方法区内存回收

很多人认为方法区(或者HotSpot虚拟机中的永久代)是没有垃圾收集的,Java虚拟机规范中确实说过可以不要求虚拟机在方法区实现垃圾收集,而且在方法区进行垃圾收集的“性价比”一般比较低:在堆中,尤其是...
  • woshichuanqihan
  • woshichuanqihan
  • 2016年09月19日 20:26
  • 1393

Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法       在《Java对象在Java虚拟机中的创建过程》了解到对象创建的内存分配,在《Java...
  • tjiyu
  • tjiyu
  • 2017年01月17日 23:16
  • 2651

《深入理解java虚拟机》读书笔记三 【回收对象和方法区】

判断对象是否该被回收
  • qq_19344223
  • qq_19344223
  • 2017年07月21日 15:22
  • 110

gc回收入门理解

1、我们都知道当我们new出一个对象时,就在堆内存分配了一个空间,存储这个对象,那么这些对象什么时候会消失呢,如果不消失,那么显然,随着创建的对象越来越多,内存分配越来越多,必然导致内存溢出。 ja...
  • u012316953
  • u012316953
  • 2016年08月28日 09:24
  • 336

JVM 运行时数据区及GC机制

—— 参考周志明的《understanding the JVM》 运行时数据区域 程序计数器 Java虚拟机栈(Java方法执行的内存模型) 本地方法栈 Java堆 方法区 GC机制 内存回收的主...
  • u013887236
  • u013887236
  • 2016年03月02日 14:19
  • 423

JAVA gc垃圾回收机制

amath321 发布于 4个月前,共有 0 条评论 一、GC概要   JVM堆相关知识     为什么先说JVM堆?     JVM的堆是Java对象的活动空间,程序中的类的对象从...
  • jiafu1115
  • jiafu1115
  • 2011年11月29日 17:35
  • 47645
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GC在堆和方法区的内存回收
举报原因:
原因补充:

(最多只允许输入30个字)