联合 jvm – 内存空间、jvm – 堆内存调配,合并后图如下:
当咱们调用一个办法的时候,就会创立这个办法的栈帧,当办法调用完结的时候,这个栈帧出栈,栈帧所占用的内存也随之开释。如果这个线程销毁了,那与这个线程相干的栈以及程序计数器的内存也随之被回收,那在堆内存中创立的对象怎么办?这些对象可是都占着很多的内存资源的。因而咱们须要晓得哪些对象是能够回收的,哪些对象是不能回收的。
可达性剖析算法
可达性算法就是从 GC Roots 登程,去搜寻他援用的对象,而后依据这个援用的对象,持续查找他援用的对象。如果一个对象到 GC Roots 没有任何援用链相连,阐明他是不可用的,这个类就能够回收,比方下图的 object5、object6、object7。
咱们回顾一下合并图:
- 类加载到办法区的时候,初始化阶段会为动态变量赋值,他所援用的对象能够做 GC Roots。
- 同样的,办法区的常量援用的对象能够做 GC Roots。
- 调用办法的时候,会创立办法的栈帧,栈帧里的局部变量援用的对象,能够做 GC Roots。
- 同样的,本地办法栈中栈帧里的局部变量援用的对象,能够做 GC Roots。
可达性算法除了 GC Roots,还有一个援用,援用分以下几种:
- 强援用 (Strong Reference):只有强援用还存在,垃圾收集器永远不会回收被援用的对象。
- 软援用 (Soft Reference):在零碎将要产生内存溢出异样之前, 将会把这些对象列进回收范畴之中进行第二次回收。如果这次回收还没有足够的内存, 才会拋出内存溢出异样。
- 弱援用 (Weak Reference):被弱援用关联的对象只能生存到下一次垃圾收集产生之前。当垃圾收集器工作时, 无论以后内存是否足够, 都会回收掉只被弱援用关联的对象。
- 虚援用 (Phantom Reference):一个对象是否有虚援用的存在, 齐全不会对其生存工夫形成影响, 也无奈通过虚援用来获得一个对象实例。为一个对象设置虚援用关联的惟一目标就是能在这个对象被收集器回收时收到一个零碎告诉。