最近在在翻看java的Garbage Collection,即大名鼎鼎的垃圾收集器GC的相关资料,整理了一下头绪,和朋友们共勉之。
Java的GC机制大名远扬,它大幅提高了程序员开发效率,省去了在c#中要显式的释放每一块内存的麻烦。我们常听到的“内存泄漏”实际上就是指无用的内存没有被及时回收。例如你声明了一个变量,而该变量所在的主进程需要运行很长时间,那么就形成了局部上的“内存泄漏”。“内存泄漏”是相对来说的,即在内存资源紧张的时候,无用的内存没有被回收,系统就会面临内存泄漏的危险。
那现在说下什么样的情况会被GC回收,说简单点就是通路断掉的内存会被回收。可以看下面例子:
Object o1 = new Object();
Object o2 = new Object();
o2 = o1;o2=o1
指明了这2个变量都指向了同一个对象,即使用了同一块内存区域,那么我们就说原o2申明的Object对象的那块内存会被GC回收,因为没有通路和它连通。
GC回收对程序员来说是透明的,要及时释放内存,最稳妥的方法就是在对象被使用完毕后,立即为该对象赋值为null,但是我们不知道什么时候这些无用资源会被回收,有什么办法可以显示执行吗?有的,就是显示调用System.gc();(该方法不保证立即会执行,因为不同的JVM使用不用算法来管理GC)。要让gc()达到立竿见影的效果,可以选择使用jdk1.2以来引入的4种对象引用类型上,废话不多说,看程序来说话:
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
class MyObject {
private String id;
public MyObject(String id) {
this.id = id;
}
public String toString() {
return id;
}
public void finalize() {
System.out.println("回收对象:" + id);
}
}
public class TestReferences {
public static void main(String[] args) {
// 创建强引用
MyObject ref = new MyObject("Hard");
System.out.println(ref);
ref = null;
System.gc();
System.out.println(ref);
// 创建软引用
SoftReference softRef = new SoftReference(
new MyObject("Soft"));
System.out.println(softRef.get());
System.gc();
System.out.println(softRef.get());
// 创建弱引用
WeakReference weakRef = new WeakReference(
new MyObject("Weak"));
System.out.println("before gc —— " + weakRef.get());
System.gc();
System.out.println("after gc —— " + weakRef.get());
// 创建虚引用
ReferenceQueue rq = new ReferenceQueue();
PhantomReference phantomRef = new PhantomReference(
new MyObject("Phantom"), rq);
System.out.println("before gc —— " + phantomRef.get());
System.gc();
System.out.println("after gc —— " + phantomRef.get());
}
}
输出如下:
Hard
null
Soft
Soft
回收对象:Hard
before gc —— Weak
after gc —— null
回收对象:Weak
before gc —— null
after gc —— null
回收对象:Phantom
以上我们创建了4种引用,依次是:强引用、软引用、弱引用、虚引用。
强引用即我们普通使用的申明方式,对于该引用,只有显示的赋值为null,gc才会视为回收对象。
软引用(SoftReference)是只有内存不足时,gc才会将它视为回收对象。
弱引用(WeakReference)是无论当前内存是否满足,gc都会去回收它。
虚引用(PahntomReference)实际是可以理解成“子虚乌有”的引用,目的仅仅是结合引用关联队列(ReferenceQueue),实现对对象引用关系的跟踪。
在 MyObject类中finalize方法中,我们让它在被回收时打印一句话出来,从输出结果来看,我们可以很容易的理解GC这4种对象引用的不同处理方式。从中我们可以得到结论,System.gc()可以对弱引用和虚引用达到立竿见影的效果。
好了以上一点小建议、想法,希望能对你有所帮助!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yibunengjing/archive/2008/06/09/2526189.aspx
分享到:
相关推荐
- 避免显式调用`System.gc()`,因为这可能会增加主GC的频率。 - 尽量减少临时对象的使用,避免无谓的对象创建和销毁。 - 不再使用对象时,将其显式设置为`null`,帮助GC判断对象是否可回收,提高效率。 - 使用`...
.NET的垃圾回收机制是通过System.GC类实现的。通过查看GC的源码,我们可以学习到.NET如何自动管理内存,以及如何避免常见的内存泄漏问题。 六、泛型与类型转换 System命名空间中的泛型类,如List和Dictionary, ...
在Android开发中,掌握以下几个核心知识点至关重要:Activity、Service、Thread、AsyncTask以及系统垃圾回收(system.gc)。这些是Android应用程序中的基础元素,理解和熟练运用它们对于构建高效、稳定的App至关重要...
当我们提到`System.gc()`时,这是Java提供的一种建议JVM进行垃圾回收的方法。然而,需要注意的是,调用这个方法并不保证立即触发垃圾回收,因为JVM可能会根据自己的策略和需要来决定何时执行垃圾回收。 在描述中的...
最后,我们使用ElapsedEventHandler来处理定时器触发事件,在这个事件中,我们使用GC.Collect()和GC.WaitForPendingFinalizers()来清理内存。 三、优点和缺点 使用System.Timers.Timer定时器来定时清理内存有以下...
3. 显式调用System.gc():虽然不推荐,但手动调用会请求进行Full GC。 4. G1垃圾收集器的混合收集(Mixed GC)失败:G1在尝试进行混合收集时,如果无法满足目标空间需求,会退化为Full GC。 5. CMS(Concurrent Mark...
Java虚拟机(JVM)中的垃圾回收(Garbage Collection,简称GC)是自动管理内存的重要机制...在实际开发中,应尽量减少对`System.gc()`的依赖,利用JVM的默认GC策略,并合理设计对象引用,以实现高效、健壮的内存管理。
- **紧急情况**:当程序遇到内存不足的情况时,可以尝试调用`System.gc()`来尝试释放一些内存。 - **测试目的**:在开发阶段,为了模拟特定的运行环境,可能会手动触发垃圾回收以观察程序的行为。 **3.3 注意事项**...
尽管可以尝试通过调用`System.gc()`来触发垃圾回收,但这并不总是最佳实践。调用此方法会导致当前线程暂停,等待GC完成,这可能会影响用户体验。而且,GC的工作方式是分批回收,可能导致内存并未完全清理,反而可能...
- **强制垃圾回收**:在计时前后的`System.gc()`调用虽然可以减少垃圾回收的影响,但也会增加额外的时间消耗。 - **系统时间精度**:`System.currentTimeMillis()`返回的是当前系统时间,其精度取决于操作系统的时钟...
综上所述,Java中的日期格式化、静态与非静态内部类的区别、字符和数字的判断方法以及`finalize()`与`System.gc()`的区别都是Java编程中非常重要的知识点。掌握这些内容对于编写高效、可靠的Java应用程序至关重要。
- `System.gc();` 触发垃圾回收,但并不立即执行。即使执行了垃圾回收,`B.num` 的值也不会改变,因为它是静态的。 #### 3. 生产者消费者模型 **知识点概述:** - **生产者消费者模式:** 一种经典的并发编程...
- 将`_xlApp`设为`null`,然后通过`System.GC.Collect(generation)`触发垃圾回收机制,确保资源被及时释放。 - 最后,将`oMissing`设为`null`。 #### 总结 以上代码展示了如何安全且彻底地关闭`Excel....
6. **System.gc()的使用**:尽管可以调用`System.gc()`建议JVM进行垃圾收集,但不应过度依赖这个方法,因为垃圾收集器何时执行、是否执行是不确定的,过度调用可能会增加系统开销,影响性能。 7. **内存泄漏与内存...
1.介绍下垃圾收集机制(在什么时候,对什么,做了什么)?...System.gc()默认也是触发Full GC。 heap dump带GC默认也是触发Full GC。 CMS GC时出现Concurrent Mode Failure会导致一次Full GC的产生。
本资料"jvm-full-gc调优-jvm-full-gc.zip"显然是针对如何减少和优化JVM的Full GC进行深入探讨的。以下将详细介绍JVM Full GC的相关知识点。 1. **理解JVM内存结构**:Java内存主要分为堆内存(Heap)和非堆内存...
垃圾回收算法(JVM)..........63 7、垃圾回收机制和调用 System.gc()的区别? .64 8. 类加载过程90 9. 反射..........101 10. 多线程和线程池........112 11.HTTP、HTTPS、TCP/IP、Socket 通信、三次握手四次挥手...