java弱引用和软引用,java 软引用和弱引用的作用

  java弱引用和软引用,java 软引用和弱引用的作用

  如何解决写爬虫IP受阻的问题?立即使用。

  在Java中,当一个对象被创建时,它被放在内存堆中。当GC运行时,如果发现没有对该对象的引用,该对象将被回收以腾出内存空间。

  或者换句话说, 一个对象被回收, 必须满足两个条件:

  1)没有参考(推荐学习:java课程)

  2)GC正在运行。

  对于java的简单情况,手动置空不需要程序员来做,因为在Java中,对于一个简单的对象,当调用它的方法结束时,对它的引用就会被GC回收。

  实际上,当我们编写代码时,往往是通过将所有指向一个对象的referece设置为null来实现的,比如:

  人p=新人(张三,18,男);//strong引用

  .

  p=null//不用的时候设置null很明显。手动设置空对象是乏味的,并且违背了程序员的自动回收机制。

  对于Java的简单情况,比如方法中生成的局部对象,程序员没必要手动清空。当调用它的方法完成时,对它的引用将被GC回收。

  在更复杂的情况下,比如使用cache,因为cache的对象正是程序需要运行的对象,所以只要程序在运行,cache中的引用就不会被GC。然后随着缓存中引用越来越多,GC无法回收的对象也越来越多,而且无法自动回收。这时候开发者必须处理回收,这显然违背了java的自动回收机制。

  对此,java中引入了弱引用(WeakReference)。

  当一个对象只被弱引用指向,而没有被任何其他强引用指向时,如果GC运行,该对象将被回收。如果有与之关联的强引用,则在垃圾回收期间不会回收该对象。

  WeakReference的语法:

  WeakReferenceT weak reference=new WeakReferenceT(referent);当你想得到弱引用所引用的对象时,首先需要判断它是否已经被回收:

  weak reference . get();如果此方法为空,则weakReference指向的对象已被回收。

  下面一个WeakReference的栗子:

  Person类:

  包com . yx . test . model;

  /**

  *人

  *

  * @作者yx

  * @日期2019/11/26 16:28

  */

  公共类人员{

  私有字符串名称;

  私人年龄;

  私弦性;

  公共人物(){

  }

  公众人物(字符串名称、年龄、性别){

  this.name=name

  this.age=年龄;

  this.sex=sex

  }

  公共字符串getName() {

  返回名称;

  }

  public void setName(字符串名){

  this.name=name

  }

  public int getAge() {

  回归年龄;

  }

  公共无效存储(整数){

  this.age=年龄;

  }

  公共字符串getSex() {

  回报性;

  }

  public void setSex(String sex) {

  this.sex=sex

  }

  }测试类TestWeakReference:

  包com . yx . test . reference;

  导入com . yx . test . model . person;

  导入Java . lang . ref . weak reference;

  /**

  * TestWeakReference

  *

  * @作者yx

  * @日期2019/11/26 16:30

  */

  公共类TestWeakReference {

  公共静态void main(String[] args) {

  人p=新人(张三,18,男);

  WeakReferencePerson weakPerson=新WeakReferencePerson(p);

  int I=0;

  while(true){

  if(weakPerson.get()!=null){

  我;

  system . out . println( I 循环的对象是活动的- weak person);

  }否则{

  System.out.println(对象已被收集。);

  打破;

  }

  }

  }

  }运行结果:

  p对1个循环有效-Java . lang . ref . weak reference @ 330 bed B4

  .

  p对62331个循环有效-Java . lang . ref . weak reference @ 330 bed B4

  p对62332个循环有效-Java . lang . ref . weak reference @ 330 bed B4

  p已收藏。可以看到,while循环执行了上万次后,P被回收了。

  经过多次测试运行程序,发现P回收时循环执行的次数是不确定的,这很好理解:因为是由GC运行的不确定性决定的。

  小结:

  1.Java当一个对象仅被弱引用引用时,如果GC运行,该对象将被回收。

  2.弱引用的一个特点是不确定何时回收;以上是java弱引用的理解和使用细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: