import java.lang.ref.SoftReference;
public class ReferenceTest {
public static void main(String[] args) {
A a = new A();
SoftReference<A> srA = new SoftReference<A>(a);
a = null;
if (srA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + srA.get());
}
// 垃圾回收
System.gc();
if (srA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + srA.get());
}
}
}
class A {
}
1 a对象尚未被回收A@4807ccf6 2 a对象尚未被回收A@4807ccf6
import java.lang.ref.WeakReference;
public class ReferenceTest {
public static void main(String[] args) {
A a = new A();
WeakReference<A> wrA = new WeakReference<A>(a);
a = null;
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
// 垃圾回收
System.gc();
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
}
}
class A {
}
a对象尚未被回收A@52e5376a a对象进入垃圾回收流程
public class MainActivity extends Activity {
//...
private int page;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
//...
page++;
} else {
//...
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
new Thread(new Runnable() {
@Override
public void run() {
//..
Message msg = Message.obtain();
msg.what = 1;
//msg.obj = xx;
handler.sendMessage(msg);
}
}).start();
//...
}
}
Issue: Ensures that Handler classes do not hold on to a reference to an outer class Id: HandlerLeak Since this Handler is declared as an inner class, it may prevent the outer class from being garbage collected. If the Handler is using a Looper or MessageQueue for a thread other than the main thread, then there is no issue. If the Handler is using the Looper or MessageQueue of the main thread, you need to fix your Handler declaration, as follows: Declare the Handler as a static class;In the outer class, instantiate a WeakReference to the outer class and pass this object to your Handler when you instantiate the Handler; Make all references to members of the outer class using the WeakReference object.
public class MainActivity extends Activity {
//...
private int page;
private MyHandler mMyHandler = new MyHandler(this);
private static class MyHandler extends Handler {
private WeakReference<MainActivity> wrActivity;
public MyHandler(MainActivity activity) {
this.wrActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
if (wrActivity.get() == null) {
return;
}
MainActivity mActivity = wrActivity.get();
if (msg.what == 1) {
//...
mActivity.page++;
} else {
//...
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//...
new Thread(new Runnable() {
@Override
public void run() {
//..
Message msg = Message.obtain();
msg.what = 1;
//msg.obj = xx;
mMyHandler.sendMessage(msg);
}
}).start();
//...
}
}
public class ReferenceTest {
public static void main(String[] args) {
A a = new A();
WeakReference<A> wrA = new WeakReference<A>(a);
a = null;
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
// 垃圾回收
System.gc();
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
}
}
class A {
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("in A finalize");
}
}
1 a对象尚未被回收A@46993aaa 2 a对象被回收 3 in A finalize
public class ReferenceTest {
public static void main(String[] args) {
A a = new A();
ReferenceQueue<A> rq = new ReferenceQueue<A>();
WeakReference<A> wrA = new WeakReference<A>(a, rq);
a = null;
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
System.out.println("rq item:" + rq.poll());
// 垃圾回收
System.gc();
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
/*
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
*/
System.out.println("rq item:" + rq.poll());
}
}
class A {
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("in A finalize");
}
}
a对象尚未被回收A@302b2c81 rq item:null a对象进入垃圾回收流程 rq item:null in A finalize
public class ReferenceTest {
public static void main(String[] args) {
A a = new A();
ReferenceQueue<A> rq = new ReferenceQueue<A>();
WeakReference<A> wrA = new WeakReference<A>(a, rq);
a = null;
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
System.out.println("rq item:" + rq.poll());
// 垃圾回收
System.gc();
if (wrA.get() == null) {
System.out.println("a对象进入垃圾回收流程");
} else {
System.out.println("a对象尚未被回收" + wrA.get());
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("rq item:" + rq.poll());
}
}
class A {
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("in A finalize");
}
}
a对象尚未被回收A@6276e1db rq item:null a对象进入垃圾回收流程 in A finalize rq item:java.lang.ref.WeakReference@645064f
public class ReferenceTest {
public static void main(String[] args) {
A a = new A();
ReferenceQueue<A> rq = new ReferenceQueue<A>();
PhantomReference<A> prA = new PhantomReference<A>(a, rq);
System.out.println("prA.get():" + prA.get());
a = null;
System.gc();
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("rq item:" + rq.poll());
}
}
class A {
}
prA.get():null rq item:java.lang.ref.PhantomReference@1da12fc0
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有