java基于内存的动态分配,回收也是自动且动态回收。
因java程序计数器、虚拟机栈、本地方法栈均伴随线程产生而产生,线程销毁而销毁。栈帧的内存基本是类加载后确定的,大多不考虑这部分的内存回收。
而java堆以及方法区不同的是,我们只有在运行时才能知道会创建哪些对象,这部分内存是动态分配的,因而采用动态回收机制。
给对象添加一个引用计数器,当对象被一个地方引用,则计数器加一;当引用失效时,计数器减一。当计数器为0时,对象为不可用,需要被清除。
缺点是两个相互引用的对象,虽然对象已无其它引用,但是也不能被清除,GC无法回收它们
使用GC roots 对象作为起点,从该节点向下搜索的路径称为引用链。当对象与GC roots之间没有任何引用链相连时,该对象为不可用。
可以作为GC roots 对象的几种情况:
是通过new 产生的对象,即Object obj = new Object(),该引用类型引用的对象永远不会被回收。
用于描述非必须但有用的对象,在可能发生内存溢出之前,会将对象列入回收范围。
用于描述非必需的对象,在下次垃圾回收时,不管内存是否足够,均会清除该类对象。
最弱的一种引用,无法通过虚引用获取一个对象。
原文:https://www.cnblogs.com/gloria-liu/p/10391423.html