标签:实例 img 一个 停止 关于 com ble omr 建议
随着程序的不断运行,程序所产生的对象必将越来越多,而系统的内存则是有限的,所以,将没有用的对象进行清除是程序长期稳定运行的关键.
垃圾回收主要关注三个问题
什么对象应该被回收?
当然是没有用的对象.当对象不再被引用时,我们认为该对象应该被回收.如何判断对象是否还被引用,会在后面详述.
对象应该在什么时间被回收?
程序在运行过程中,对象的引用关系是一直变化的,如何选择合适的时机开始GC,也是一个重要的问题,后面详述.
应该怎样回收?
当我们知道是无用对象后,如何将无用对象清除,保留有用对象,将是垃圾回收算法主要关注的问题,将在下一节详述.
主要有两种办法判断对象是否被引用.
如GCRoot引用到了A对象。
A对象引用到了B对象。
则A、B对象都不可以回收。
注:哪些对象可以作为GC Roots?
注:一般将哪些位置作为安全点?
public class FinalizeEscapeGC {
public static FinalizeEscapeGC SAVE_HOOK = null;
public void isAlive() {
System.out.println("对象仍然活着!!!");
}
protected void finalize() throws Throwable {
super.finalize();
System.out.println("finalize()方法被执行!!!");
FinalizeEscapeGC.SAVE_HOOK = this;
}
public static void main(String[] args) throws Throwable {
new FinalizeEscapeGC(); // 对象被创建
SAVE_HOOK = null;
System.gc(); // 回收,会执行finalize()
Thread.sleep(500);
if (SAVE_HOOK != null) {
SAVE_HOOK.isAlive();
} else {
System.out.println("对象已死!!!");
}
SAVE_HOOK = null;
System.gc(); // 回收,finalize()已经被执行过,不会再被执行
Thread.sleep(500);
if (SAVE_HOOK != null) {
SAVE_HOOK.isAlive();
} else {
System.out.println("对象已死!!!");
}
}
}
finalize()方法被执行!!!
对象仍然活着!!!
对象已死!!!
1.强引用
Object obj = new Object();
除非栈帧清空,强引用不会被GC,即使发生OOM.
2.软引用
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();//有时候会返回null
软引用在发生内存不足时会被回收,内存足够时何以通过get()获取.
软引用通常被用于实现缓存.
3.弱引用
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();//有时候会返回null
wf.isEnQueued();//返回是否被垃圾回收器标记为即将回收
弱引用是在第二次垃圾回收时回收,即使内存足够.短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null
4.虚引用
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();//永远返回null
pf.isEnQueued();//返回是否从内存中已经删除
在垃圾回收时,虚引用一定会被回收,就和没有引用一样.
废弃常量
如"abc"如果没有任何引用,则会被回收.
废弃类
对废弃类的回收需要满足一下三个条件:
1.该类的所有实例已被回收
2.该类的ClassLoader已被回收
3.该类对应的java.lang.Class对象无任何地方被引用
注:可以通过参数-Xnoclassgc,设置是否对类进行回收.
在大量使用反射,动态代理,CGLib等ByteCode框架, 动态生成JSP以及OSGi这类频繁
自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出。
标签:实例 img 一个 停止 关于 com ble omr 建议
原文地址:https://www.cnblogs.com/guan-li/p/11505597.html