Re: help with weak references

Jasper-M <[email protected]> Mon, 4 Jan 2016 07:26:16 -0800 (PST)
Newsgroups gmane.comp.lang.scala
Message-ID <[email protected]>
To illustrate my comments.

scala>  import scala.ref.WeakReference
import scala.ref.WeakReference

scala>  val rq = new scala.ref.ReferenceQueue[List[Int]]
rq: scala.ref.ReferenceQueue[List[Int]] = 
java.lang.ref.ReferenceQueue@2efbfe50

scala>  class WR(a: List[Int]) { val wr = new WeakReference(a, rq)}
defined class WR

scala> val wr = new WR((0 until 5).toList) //example 1
wr: WR = WR@6b931b97

scala> println(wr.wr.get)
Some(List(0, 1, 2, 3, 4))

scala> System.gc()

scala> println(wr.wr.get)
None

scala> val wr = new WR((0 until 5).toList) //example 2
wr: WR = WR@7675f36f

scala> val x = wr.wr.get
x: Option[List[Int]] = Some(List(0, 1, 2, 3, 4))

scala> val x = 3
x: Int = 3

scala> System.gc()

scala> println(wr.wr.get)
Some(List(0, 1, 2, 3, 4))

Since WR is now a normal class no reference to the list is kept and the 
object gets garbage collected.
In the second example it doesn't get garbage collected because x is 
shadowed but still exists. The JVM doesn't know that in the context of the 
REPL it has become unreachable.


Op maandag 4 januari 2016 16:08:06 UTC+1 schreef Jasper-M:
>
> Two things:
>   - I'm not sure but I don't think redefining x is enough to convince the 
> jvm that the first reference is unreachable,
>   - val wr still refers to an object that refers to the list (the val `a` 
> of case class WR).
>
> Op maandag 4 januari 2016 12:02:27 UTC+1 schreef [email protected]:
>>
>> Weak references don't seem to be eagerly collected as the following 
>> script illustrates. Why?
>>
>> ---------------------
>> Welcome to Scala version 2.11.4 (Java HotSpot(TM) 64-Bit Server VM, Java 
>> 1.8.0_60).
>> Type in expressions to have them evaluated.
>> Type :help for more information.
>>
>> scala> import scala.ref.WeakReference
>> import scala.ref.WeakReference
>>
>> scala> val rq = new scala.ref.ReferenceQueue[List[Int]]
>> rq: scala.ref.ReferenceQueue[List[Int]] = 
>> java.lang.ref.ReferenceQueue@ba2f4ec
>>
>> scala> case class WR(a: List[Int]) { val wr = new WeakReference(a, rq)}
>> defined class WR
>>
>> scala> val wr = WR((0 until 5).toList)
>> wr: WR = WR(List(0, 1, 2, 3, 4))
>>
>> scala> val x = wr.wr.get
>> x: Option[List[Int]] = Some(List(0, 1, 2, 3, 4))
>>
>> scala> val x = 3      // re-define x
>> x: Int = 3
>>
>> scala>  System.gc()
>>
>> scala> val x = wr.wr.get
>> x: Option[List[Int]] = Some(List(0, 1, 2, 3, 4))  // <<------ should 
>> have been None
>>
>> scala> 
>>
>>

-- 
You received this message because you are subscribed to the Google Groups "scala-language" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.