jvm-垃圾回收-1

113 阅读5分钟

jvm中对于不再存活的对象进项垃圾回收,那又是怎样判断对象是否存活?怎样垃圾回收?以及用什么样的方式进行垃圾回收?

1.JVM 是如何判断对象是否存活的?

通过可达性分析算法 这个算法的基本思路就是通过 一系列称为“GC Roots”的根对 象作为起始节点集,从这些节 点开始,根据引用关系向下搜 索,搜索过程所走过的路径称 为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从 GC Roots到这个对象不可达时, 则证明此对象是不可能再被使 用的

image.png

2.gc roots 又是什么?

在Java技术体系里面,主要是几个区域的引用对象;固定可作为GC Roots的对象包括以下几种:

  • ·在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用 到的参数、局部变量、临时变量等。
  • ·在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。
  • ·在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。
  • ·在本地方法栈中JNI(即通常所说的Native方法)引用的对象。
  • ·Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如 NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。
  • ·所有被同步锁(synchronized关键字)持有的对象。
  • ·反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等

3.Java中对象的引用类型有什么?垃圾回收下的表现是什么样的?

在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减 弱。

  • ·强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的 对象。
  • ·软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常 前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出 异常。在JDK 1.2版之后提供了SoftReference类来实现软引用。
  • ·弱引用也是用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下 一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对 象。在JDK 1.2版之后提供了WeakReference类来实现弱引用。
  • ·虚引用也称为“幽灵引用”或者“幻影引用”,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全 不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目 的只是为了能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2版之后提供了PhantomReference类来 实现虚引用。

4.如果对象不可达,Jvm会立即回收这个对象吗 ?

JVM 篇 即使在可达性分析算法中判定为不可达的对象,也不是“非死不可”的,这时候它们暂时还处于“缓刑”阶段, 要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执 行finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,那么虚拟机将 这两种情况都视为“没有必要执行”。

如果这个对象被判定为确有必要执行finalize()方法,那么该对象将会被放置在一个名为F-Queue的队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize()方法。

5.方法区有垃圾回收吗 ?

JVM 篇 《Java虚拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集,方法区垃圾收 集的“性价比”通常也是比较低的:在Java堆中,尤其是在新生代中,对常规应用进行一次 垃圾收集通常可以回收70%至99%的内存空间,相比之下,方法区回收囿于苛刻的判定条 件,其区域垃圾收集的回收成果往往远低于此。 方法区的垃圾收集主要回收两部分内容:废弃的常量和不再使用的类型