public class SoftReferenceTest {
private static List<Byte[]> list = new ArrayList<Byte[]>();;
private static SoftReference<SoftReferenceTest> sr;
public static void main(String[] args) {
// 软引用
// 当内存溢出的时候,应用的对象会被 回收
sr = new SoftReference<SoftReferenceTest>(new SoftReferenceTest());
System.out.println("sr : " + sr.get());
sr= null;
System.gc();
// 产生MMO后可以看到finalize的执行,即“软引用,当内存溢出的时候,应用的对象会被 回收”
// Byte[] bytes = null;
// for (int i = 0; i < 50000; i++) {
// bytes = new Byte[1024 * 1024];
// list.add(bytes);
// }
}
@Override
protected void finalize() throws Throwable {
System.out.println("SoftReferenceTest ... finalize ... exec...");
System.out.println("sr : " + sr.get());
}
}
为什么finalize的第二个System.out.println没有打印?
package com.pt;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import org.junit.Test;
public class RefTest {
@Test
public void testStrongRef() {
User user = new User("pan");
User strongRef = user;
user = null;
System.gc();
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("Strong: " + strongRef.getUserName());
//------测试发现,String不会被回收------
// {
// String str = "hello";
// String strongRef = str; //强引用
// str = null;
// System.gc(); //垃圾回收
// try {
// Thread.sleep(1000);
// } catch (Exception e) {
// // TODO: handle exception
// }
// System.out.println("Strong: " + strongRef);
// }
}
@Test
public void testWeakRef(){
User user = new User("pan");
WeakReference<User> weakRef = new WeakReference<User>(user);
System.out.println("weakRef: " + weakRef.get().getUserName());
user = null;
System.gc();
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
//null
System.out.println("weakRef: " + weakRef.get());
//-----------测试发现String不会被回收---------
// String str = "hello";
// WeakReference wr = new WeakReference(str);
// System.out.println("weakRef: " + wr.get());
// str = null;
// System.gc();
// System.gc();
// System.gc();
// try {
// Thread.sleep(3000);
// } catch (Exception e) {
// // TODO: handle exception
// }
// System.out.println("weakRef: " + wr.get());
}
@Test
public void testSoftRef(){
User user = new User("pan");
SoftReference<User> softRef = new SoftReference<User>(user);
System.out.println("SoftRef: " + softRef.get().getUserName());
user = null;
System.gc();
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
//非null
System.out.println("SoftRef: " + softRef.get());
//-----------测试发现String不会被回收---------
// String str = "hello";
// WeakReference wr = new WeakReference(str);
// System.out.println("weakRef: " + wr.get());
// str = null;
// System.gc();
// System.gc();
// System.gc();
// try {
// Thread.sleep(3000);
// } catch (Exception e) {
// // TODO: handle exception
// }
// System.out.println("weakRef: " + wr.get());
}
}
不要显式调用gc,对性能影响很大
finalize 只会被调用一次
周志明版 深入理解java虚拟机