理解Java垃圾回收机制及其案例
Java垃圾回收(Garbage Collection,GC)是Java语言的一个核心特性,它自动管理内存,帮助开发者减少内存泄漏和提高程序性能。以下是Java垃圾回收机制的一些基本概念和案例。
基本概念1. 堆(Heap):Java堆是JVM中用于存储对象实例的区域。堆是垃圾回收的主要区域。
垃圾回收器(Garbage Collector,GC):JVM中的垃圾回收器负责自动回收不再被引用的对象所占用的内存。
引用(Reference):Java中的对象通过引用来访问。引用可以是强引用、软引用、弱引用和虚引用。
可达性(Reachability):如果一个对象从根集合(如静态变量、局部变量等)开始可以通过引用链到达,那么这个对象被认为是可达的。
标记-清除(Mark-Sweep):一种垃圾回收算法,首先标记所有可达的对象,然后清除所有未标记的对象。
复制(Copying):将存活的对象从当前区域复制到另一个区域,然后清除原区域。
标记-整理(Mark-Compact):先标记所有可达对象,然后将存活的对象向一端移动,清理边界外的内存。
分代收集(Generational Collection):基于对象生命周期的不同,将堆分为新生代和老年代,分别采用不同的垃圾回收策略。
垃圾回收案例案例1:对象不再被引用
javapublic class Example {
public static void main(String[] args) {
Object obj = new Object();
obj = null; // obj不再被引用 }
}
在这个例子中,obj
最初指向一个新创建的对象。当obj
被设置为null
后,这个对象不再被任何引用指向,因此它变成了垃圾,GC会在下一次垃圾回收周期中回收这个对象。
案例2:循环引用
javapublic class Example {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
obj1 = obj2;
obj2 = obj1;
obj1 = null;
obj2 = null;
}
}
在这个例子中,obj1
和obj2
相互引用,即使它们都被设置为null
,由于它们之间形成了循环引用,它们不会被GC回收,除非使用弱引用或软引用。
案例3:使用软引用
```javaimport java.lang.ref.SoftReference;
public class Example {
public static void main(String[] args) {
SoftReference
还没有评论,来说两句吧...