From 99acc09b3e82ebfd8c979e815a0b16a4a11d2e99 Mon Sep 17 00:00:00 2001 From: Pavel Afremov Date: Fri, 8 Jun 2007 17:39:26 +0400 Subject: [PATCH] Make interned string collectable by GC. Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous patch contains a bug – debug version of InternMap which doesn’t provide Garbage Collectable Intern String. This patch fixes it by WeakReference mechanism. Also patch enables stress.Intern smoke test. --- vm/tests/smoke/stress/Intern.java | 15 +++++++++------ .../org/apache/harmony/kernel/vm/InternMap.java | 18 +++++++----------- .../javasrc/org/apache/harmony/kernel/vm/VM.java | 4 ---- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/vm/tests/smoke/stress/Intern.java b/vm/tests/smoke/stress/Intern.java index 84c4667..0126390 100644 --- a/vm/tests/smoke/stress/Intern.java +++ b/vm/tests/smoke/stress/Intern.java @@ -17,16 +17,19 @@ package stress; /** * Tests the correctness of string interning. - * - * @keyword XXX_stress */ public class Intern { public static void main(String[] args) { String s = "abc"; - for (int i = 0; i < 100000; i++) { - s = (s + i + s).intern(); - if (s.length() > 65536) s = "abc" + i; - if (i % 1000 == 0) trace("."); + try { + for (int i = 0; i < 100000; i++) { + s = (s + i + s).intern(); + if (s.length() > 65536) s = "abc" + i; + if (i % 1000 == 0) trace("."); + } + System.out.println("\nPASSED"); + } catch (OutOfMemoryError oome) { + System.out.println("\nFAILED"); } } diff --git a/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/InternMap.java b/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/InternMap.java index 4eb0bc6..f50f6b3 100644 --- a/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/InternMap.java +++ b/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/InternMap.java @@ -25,7 +25,7 @@ import java.lang.ref.WeakReference; */ public class InternMap { - private final ReferenceQueue referenceQueue; + private final ReferenceQueue referenceQueue; int elementCount; @@ -40,13 +40,11 @@ public class InternMap { return new Entry[size]; } - private static final class Entry/* extends WeakReference*/ { + private static final class Entry extends WeakReference { int hash; - Entry next; - String key; - Entry(String key, ReferenceQueue queue) { - //super(key, queue); - this.key = key; + Entry next; + Entry(String key, ReferenceQueue queue) { + super(key, queue); hash = key.hashCode(); } } @@ -57,7 +55,7 @@ public class InternMap { elementData = newEntryArray(capacity == 0 ? 1 : capacity); loadFactor = 7500; // Default load factor of 0.75 computeMaxSize(); - referenceQueue = new ReferenceQueue(); + referenceQueue = new ReferenceQueue(); } else { throw new IllegalArgumentException(); } @@ -69,12 +67,10 @@ public class InternMap { void poll() { - /* Entry toRemove; while ((toRemove = (Entry)referenceQueue.poll()) != null) { removeEntry(toRemove); } - */ } void removeEntry(Entry toRemove) @@ -110,7 +106,7 @@ public class InternMap { int length = elementData.length; index = (hash & 0x7FFFFFFF) % length; entry = elementData[index]; - while (entry != null && !key.equals(interned = (String)entry.key/*get()*/)) { + while (entry != null && !key.equals(interned = (String)entry.get())) { entry = entry.next; } diff --git a/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/VM.java b/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/VM.java index 75f815c..695b346 100644 --- a/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/VM.java +++ b/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/VM.java @@ -22,8 +22,6 @@ package org.apache.harmony.kernel.vm; import org.apache.harmony.vm.VMStack; -import java.lang.ref.WeakReference; -import java.util.WeakHashMap; public final class VM { @@ -115,8 +113,6 @@ public final class VM { /** * Invokes native string interning service. */ - private static native String intern0(String s); - private static InternMap internedStrings; static { -- 1.4.1