Java弱引用,java弱引用和软引用
java基础教程栏目介绍Java"弱" 引用
如何解决写爬虫IP受阻的问题?立即使用。
推荐(免费):java基础教程
当Java中的对象obj被创建时,它被放在堆中。GC运行时发现没有对obj的引用,所以会回收obj对象的堆内存空间。
换句话说,一个对象被回收, 必须满足两个条件:
(1)没有引用它。
(2)操作GC。
在实际开发中,我们可以通过将对一个对象的所有引用设置为null来确保该对象在下次GC运行时被回收,如下所示:
对象c=新车();
c=空;但是,这样做是一件繁琐的事情,违背了GC自动恢复的原则。对于简单的情况,手动置空不需要程序员来做,因为在java中,对于简单的对象,当调用它的方法结束时,对它的引用会从堆栈中弹出,所以在下次GC执行时可以回收。
然而,也有特殊的例外。在使用cache时,由于cache中的对象正是程序运行所需要的,所以只要程序在运行,cache中的引用就不会被GC收集(换句话说,cache中的引用与主程序具有相同的生命周期)。然后随着缓存中引用的数量越来越多,越来越多的对象无法被GC收集,所以无法自动收集。当这些对象需要回收时,回收这些对象的任务就留给了程序员。但是,这违背了GC(可回收对象的自动回收)的本质。
因此,java中引入了弱引用。
对象c=新车();//只要C还指向car对象,car对象就不会被回收——(强引用)当一个对象只被弱引用指向,没有其他强引用时,如果GC运行,那么这个对象就会被回收。
这里有一个在线例子。首先,定义一个实体类:
公共类汽车{
私人双倍价格;
私有字符串颜色;
公共汽车(双倍价格,串色)
{
this.price=价格;
this.color=color
}
public double getPrice()
{
退货价格;
}
公共字符串getColor()
{
返回颜色;
}
公共字符串toString()
{
“return”这辆车是“this.color”车,价格为$;
}
}一般在使用WeakReference时,定义一个类继承WeakReference,在这个类中定义了一些其他属性,所以这里不定义其他属性:
公共类WeakReferenceCar扩展了WeakReferenceCar
{
公共武器参考车
{
超(车);
}
}调用}main函数,当然为了更清楚的看到GC的效果,设置虚拟机参数“-XX:printgdetails”:
公共静态void main(String[] args)
{
车car=新车(2000.0,红色);
WeakReferenceCar wrc=新WeakReferenceCar(汽车);
WRC . setstr( 111 );
int I=0;
while(真)
{
if (wrc.get()!=空)
{
我;
system . out . println( WeakReferenceCar的车为 I 而活,loop- WRC);
}
其他
{
system . out . println( WeakReferenceCar的车有bean收藏);
打破;
}
}
}最后是运行结果。
WeakReferenceCar的车活了68450,循环采访。WeakReferenceCar@776ec8df
WeakReferenceCar的车活了68451,循环采访。WeakReferenceCar@776ec8df
WeakReferenceCar的车活了68452,循环采访。WeakReferenceCar@776ec8df
WeakReferenceCar的车活了68453,循环采访。WeakReferenceCar@776ec8df
[GC(分配失败)[PSYoungGen:34304k-1000k(38400k)]34320k-1016k(125952k),0.0015129秒] [Times: user=0.02 sys=0.02,real=0.00秒]
WeakReferenceCar的车活了68454,循环采访。WeakReferenceCar@776ec8df
WeakReferenceCar的车已经被收集了
许多
PSYoungGen总计38400K,已用1986K [0x00000000d5e00000,0x00000000da900000,0x0000000100000000
伊甸园空间33280K,已用2%[0x 00000000 D5 e 00000,0x 0000000 D5 ef6b 70,0x 00000000 D7 e 80000]
从空间5120K中,19%已使用[0x00000000d7e80000,0x 0000000 D7 f 7a 020,0x 00000000d 8380000]
对于空间5120K,使用了0%[0x 00000000 da 400000,0x 0000000 da 4000000,0x 0000000 da 900000]
ParOldGen total 87552K,已用16K[0x 0000000081 a 000000,0x0000000086f80000,0x 0000000 D5 e 00000]
对象空间87552K,0%已用[0x0000000081a00000,0x 000000081 a 04000,0x 000000086 f 80000]
元空间使用了3547K,容量4564K,提交了4864K,保留了1056768K
使用的类空间381k,容量388k,提交的512k,保留的1048576k。可以看出,68454周期后,与WeakReferenceCar关联的对象car被回收。请注意,与弱引用关联的对象car被回收,而不是wrc本身。
弱引用的一个特点是不确定何时回收,因为这是由GC操作的不确定性决定的。所以一般WeakReference引用的对象都是有价值的对象,是缓存的,容易重建的,消耗大量内存。
弱引用指向的对象被回收后,弱引用本身其实是没用的。java提供了一个ReferenceQueue来存储其指向的对象已经被回收的引用。用法是在定义WeakReference时将ReferenceQueue对象作为参数传递给构造函数。以上都是为了看看Java里的‘弱’引用是什么?更多详情请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。