diff --git a/src/library/scala/collection/mutable/HashMap.scala b/src/library/scala/collection/mutable/HashMap.scala index 6fca75f..91dff4a 100644 --- a/src/library/scala/collection/mutable/HashMap.scala +++ b/src/library/scala/collection/mutable/HashMap.scala @@ -82,8 +82,10 @@ extends AbstractMap[A, B] override def remove(key: A): Option[B] = { val e = removeEntry(key) - if (e ne null) Some(e.value) - else None + if (e ne null) { + e.next = null // remove link into hashmap to help tracing gcs + Some(e.value) + } else None } def += (kv: (A, B)): this.type = { @@ -92,7 +94,11 @@ extends AbstractMap[A, B] this } - def -=(key: A): this.type = { removeEntry(key); this } + def -=(key: A): this.type = { + val e = removeEntry(key); + if (e ne null) e.next = null // remove link into hashmap to help tracing gcs + this + } def iterator = entriesIterator map (e => ((e.key, e.value))) diff --git a/src/library/scala/collection/mutable/LinkedHashMap.scala b/src/library/scala/collection/mutable/LinkedHashMap.scala index b64504b..5f133d7 100644 --- a/src/library/scala/collection/mutable/LinkedHashMap.scala +++ b/src/library/scala/collection/mutable/LinkedHashMap.scala @@ -81,6 +81,11 @@ class LinkedHashMap[A, B] extends AbstractMap[A, B] else e.earlier.later = e.later if (e.later eq null) lastEntry = e.earlier else e.later.earlier = e.earlier + + // remove links into hashmap to help tracing gcs + e.earlier = null + e.later = null + Some(e.value) } } diff --git a/src/library/scala/collection/mutable/LinkedHashSet.scala b/src/library/scala/collection/mutable/LinkedHashSet.scala index 1768c94..45551ea 100644 --- a/src/library/scala/collection/mutable/LinkedHashSet.scala +++ b/src/library/scala/collection/mutable/LinkedHashSet.scala @@ -73,6 +73,11 @@ class LinkedHashSet[A] extends AbstractSet[A] else e.earlier.later = e.later if (e.later eq null) lastEntry = e.earlier else e.later.earlier = e.earlier + + // remove links into hashset to help tracing gcs + e.later = null + e.earlier = null + true } } diff --git a/src/library/scala/collection/parallel/mutable/ParHashMap.scala b/src/library/scala/collection/parallel/mutable/ParHashMap.scala index bb3737f..f8997fb 100644 --- a/src/library/scala/collection/parallel/mutable/ParHashMap.scala +++ b/src/library/scala/collection/parallel/mutable/ParHashMap.scala @@ -77,8 +77,10 @@ self => def remove(key: K): Option[V] = { val e = removeEntry(key) - if (e ne null) Some(e.value) - else None + if (e ne null) { + e.next = null // remove link into hashmap to help tracing gcs + Some(e.value) + } else None } def += (kv: (K, V)): this.type = { @@ -87,7 +89,11 @@ self => this } - def -=(key: K): this.type = { removeEntry(key); this } + def -=(key: K): this.type = { + val e = removeEntry(key) + if (e ne null) e.next = null // remove link into hashmap to help tracing gcs + this + } override def stringPrefix = "ParHashMap"