最近在在翻看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
分享到:
相关推荐
SRE 每天都处理生产环境中出现的各种各样的问题,有些问题很具有代表性,这次我们将分享与Java语言中System.gc()相关的两个典型案例,介绍如何分析这种问题,并且如何定位且修复这些问题。
主要介绍了Android垃圾回收机制及程序优化System.gc的相关资料,需要的朋友可以参考下
java.lang.System.gc();?/?java.lang.Runtime.gc(); 垃圾回收的建议语句,只能建议而不能强制回收 滨意: System.gc(); 是静态方滕,可直接踃用。 java.lang.Runtime.gc(); 不是静态方滕,不能直接在main方滕里踃用 ...
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收 答:对于GC来说,当程序员...程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
1.介绍下垃圾收集机制(在什么时候,对什么,做了什么)?...System.gc()默认也是触发Full GC。 heap dump带GC默认也是触发Full GC。 CMS GC时出现Concurrent Mode Failure会导致一次Full GC的产生。
android中比较需要理解的知识点 activity service thread AsynTask system.gc view
Java 到底有哪些优势? 1.跨平台(平台=OS) 可移植性 在不同的操作系统之上可以不用做任何代码的修 改 直接使用 ...问题: System.gc(); Runtime.getRuntime().gc(); 调用gc 的下一行是否回收?不一定
数据库索引的优点和缺点 一、为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能。 ...程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
数据库索引的优点和缺点 一、为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能。 ...程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
数据库索引的优点和缺点 一、为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能。 ...程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
System.gc(); e.printStackTrace(); } // 下面是得到用于和COM口通讯的输进、输出流。 try { in = new InputStreamReader(serialPort.getInputStream()); out = new OutputStreamWriter(serialPort....
数据库索引的优点和缺点 一、为什么要创建索引呢(优点)? 这是因为,创建索引可以大大提高系统的性能。 ...程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
System.gc() Runtime.getRuntime().gc() 37.String s = new String(\"xyz\");创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 38.abstract class和interface有什么区别? ...
jsr179读取卫星定位数据,可以设置读取间隔时间, 文件包括:使用说明文档,源码。 范例: GPSManager gps=new GPSManager(10); Thread GPSThread = new Thread(gps); GPSCanvas gpsreadListener =...System.gc(); } }
Java中的垃圾回收机制(System.gc和finaliz()); 10。sleeep和stop的区别; 11。notify和notifyAll的区别; 12。写代码来反转list; 13。抽象类和接口有什么不同; 14。常用的布局管理器有哪几种,那个会变形,哪个不会...
java.lang.System.gc(); 建议回收内存,但系统不一定回应,他会先去看内存是否够用,够用则不予理睬,不够用才会去进行垃圾回收 内存中什么算是垃圾: 不再被引用的对象(局部变量,没有指针指向的) java的...
System.gc(),真的是随叫随到? 软引用弱引用的错误使用 你觉得内存释放了,它就真的释放了么? 幸得Android Monitor 提供了内存监视器,起码打开了一个窗口可以让我们看看当前应用的内存到底是什么样的。 那么现在...
网上关于四种引用长篇概论很多,不过大多是理论,看是看懂了可能就是一头雾水,下面我用很简单的代码帮助你加强理解和记忆。 前述:除了强引用外,其他引用不是我们所常见的 new出来的对象,而是需要借用... System.gc