深入JAVA虚拟机_ GC ROOT


layout: post

title: 深入JAVA虚拟机_ GC ROOT

categories:JVM JAVA

description: 深入JAVA虚拟机_结构

keywords: JVM JAVA


GC_ROOT的对象包括

1.虚拟机栈(栈帧的本地变量表)中的引用对象(方法中的参数,方法体中的局部变量)。
2.方法区中类静态属性引用的对象(static)。
3.方法区中常量引用的对象(final static)。
4.本地方法栈中JNI(Native方法)引用的对象。

强引用: 强引用就是指在程序代码中普遍存在的类似 Object oj = new Object(); 这类
的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象

软引用: 用来描述一些有用但非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前将会把这些对象列进回收范围之类进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。(SoftReference类实现)

弱引用: 用来描述非必需对象,但它的强度比软引用弱一些,被软引用关联的 对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时无论当前内存是否足够,都会回收掉只被弱引用关联的对象。(WeakReference类实现)

虚引用: 最弱的引用关系。一个人对象是否有虚引用的存在完全不会对其生存时间造成影响,也无法通过虚引用来取得一个对象实例(其get()只能获得null)。为一个对象设置一个虚引用关联的唯一目的就是能在这个对象被回收器回收时收到一个系统通知。(PhantomReference类实现)

System.gc()

只能提醒虚拟机程序员希望进行一次垃圾回收,但并不保证垃圾回收一定会运行,垃圾回收的进行取决虚拟机,不同的虚拟机有不同的实现。

两种GC方式:

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多生存时间不长,所以Minor GC非常频繁,一般回收速度也比较快。

老年代GC(Full GC):指发生在老年代的GC,出现一次Full GC至少经历一次Minor GC(当Minor GC仍然满足不了空间分配才会触发Full GC)。

对象分配

大部分新生对象会在新生代Eden区分配,但Eden区没有足够空间进行分配时,会进行一次Minor GC。较大的对象([需要大量连续内存的java对象]-XX:PretenureSizeThreshold 可设置大对象的门槛)会直接分配至老年代。
长期在survivor中存活的对象每经历一次GC则其对象年龄计数器+1,当计数器的值超过某个阈值(-XX:MaxTenuringThreshold),则将该对象转至老年代。

参考: https://stackoverflow.com/questions/3329691/understanding-javas-reference-classes-softreference-weakreference-and-phanto

你可能感兴趣的:(深入JAVA虚拟机_ GC ROOT)