一、 Java的垃圾回收机制
它使得Java程序员在编写程序的时候不需要考虑内存管理。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。程序员可以手动执行System.gc(),通知GC运行,但Java语音规范并不能保证GC一定会执行。
二、 如何判断哪些对象需要回收呢
三、JVM的4种引用和使用场景
1. 强引用-StrongReference
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。在程序内存不足(OOM)的时候也不会被回收,使用方式:
String str = new String("str");
2. 软引用-SoftReference
软引用在程序空间内存不足时,会被回收。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3. 弱引用-WeakReference
只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
4. 虚引用-PhantomReference
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference(object,queue);
四、典型的垃圾收集算法
在确定了哪些垃圾可以被回收后,垃圾收集器要做的事情就是开始进行垃圾回收,但是这里面涉及到一个问题是:如何高效地进行垃圾回收。由于Java虚拟机规范并没有对如何实现垃圾收集器做出明确的规定,因此各个厂商的虚拟机可以采用不同的方式来实现垃圾收集器,所以在此只讨论几种常见的垃圾收集算法的核心思想。
1. Mark-Sweep(标记-清除)算法
缺点:效率问题
空间问题:标记清除之后会产生大量不连续的内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发一次垃圾回收动作。
2. Copying(复制)算法
3. Mark-Compact(标记-整理)算法
4. 分代收集算法
五、GC用的可达性分析算法中,哪些对象可以作为GC Roots对象?
1. 虚拟机栈中引用的对象。
2. 本地方法栈中引用的对象。
3.方法区中的静态成员或常量引用的对象。
参考资料:
《深入理解Java虚拟机》