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.