For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
垃圾回收机制的学习与应用是每一位Java编程开发程序员都应该熟练掌握的一个编程技能,而本文我们就通过案例分析来简单垃圾一下,垃圾回收机制对象判断方法都有哪些。
1.引用计数法
在对象头维护着一个counter计数器,对象被引用一次则计数器+1;若引用失效则计数器-1。当计数器为0时,就认为该对象无效了。
主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中主要的原因是它很难解决对象之间相互循环引用的问题。发生循环引用的对象的引用计数永远不会为0,结果这些对象就永远不会被释放。
2.可达性分析算法
从GCRoots为起点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GCRoots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。
Java中,GCRoots是指:
Java虚拟机栈(栈帧中的本地变量表)中引用的对象
本地方法栈中引用的对象
方法区中常量引用的对象
方法区中类静态属性引用的对象
3.Java中的引用
Java对引用的概念进行了扩充,将引用分为强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference)4种,这4种引用强度依次逐渐减弱。
这样子设计的原因主要是为了描述这样一类对象:当内存空间还足够时,则能保留在内存之中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。很多系统的缓存功能都符合这样的应用场景。
也就是说,对不同的引用类型,JVM在进行GC时会有着不同的执行策略。所以我们也需要去了解一下。
A.强引用(StrongReference)
只要强引用存在,垃圾收集器永远不会回收被引用的对象,只有当引用被设为null的时候,对象才会被回收。但是,如果我们错误地保持了强引用,比如:赋值给了static变量,那么对象在很长一段时间内不会被回收,会产生内存泄漏。
B.软引用(SoftReference)
软引用是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当JVM认为内存不足时,才会去试图回收软引用指向的对象。JVM会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。
软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。
C.弱引用(WeakReference)
弱引用的强度比软引用更弱一些。当JVM进行垃圾回收时,无论内存是否充足,都会回收只被弱引用关联的对象。
D.幻象引用/虚引用(PhantomReferences)
虚引用也称为幽灵引用或者幻影引用,它是弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的目的就是能在这个对象被收集器回收时收到一个系统通知。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。