一、垃圾回收机原理
Jvm(Java虚拟机)通过专属线程来回收不再使用的内存对象空间,对于处理该任务的进程叫做“垃圾回收器”,根据用户对系统模块的定制或优化需求可以配置不同的垃圾回收器来更有效执行(参考第二章节)。触发垃圾回收器回收场景如下(不在使用的对象)对象没有引用@b@程序中使用System.exit()@b@发生未捕获异常@b@对象所属的作用域执行完毕@b@程序被意外终止(kill所属进程)
对于对象的引用又分为强引用、软引用、弱引用、虚引用,下面分别举例说明
强引用 - 通常我们创建的对象都是这种形式,对象只有在主动释放引用后才会被释放,形式如下B b=new B();
软引用 - 采用SoftReference来实现,其内存不足时被回收(用例缓存),形式如下Object obj = new Object();@b@SoftReference sf = new SoftReference(obj);@b@obj = null;@b@sf.get();//有时候会返回null
弱引用 - 采用WeakReference来实现,采用弱引用建立引用的对象没有强引用后,GC时及会被自动释放(第二次垃圾回收时回收,用例 - 监控对象内存状态),形式如下Object obj=new Object();@b@WeakReference weakRef=new WeakReference(object);//可通过weakRef.get来获取对象@b@object=null@b@if(wf.isEnQueued())@b@System.out.print("WeakReference"对象即将被回收);
虚引用 - 采用PhantomReference来实现,每次垃圾回收的时候都会被回收(用例跟踪对象是否从内存中删除)Object obj = new Object();@b@PhantomReference pf = new PhantomReference(obj);@b@obj=null;@b@pf.get();//永远返回null @b@if(pf.isEnQueued())@b@System.out.print("PhantomReference"对象已经删除);
另对象在内存的存活机制 - 当新对象要分配到内存中,首先检查空间是否足够,不够就触发GC进行实时回收,如果对象被长时间引用,改对象逐渐从eden到survivor,最后保存到老年代。下面用java visualVM查看,当新生代满了,对象会转移到老年代,进行加载实例化,如果老年代满了,就抛出outOfMemory异常(详情参见内存优化说明页),如下图1-1所示