xerces-j2/JIRA-Issue-1521-http-issues.apache.org-jira-browse-X.patch
2020-09-19 14:49:48 +08:00

72 lines
2.9 KiB
Diff

From 51c3e1286d7923eb2ecbc97aade9d2cf5faa22b7 Mon Sep 17 00:00:00 2001
From: Michael Glavassevich <mrglavas@apache.org>
Date: Tue, 9 Aug 2011 14:51:31 +0000
Subject: [PATCH] JIRA Issue #1521:
http://issues.apache.org/jira/browse/XERCESJ-1521. Compact the
SoftReferenceSymbolTable if after cleaning out cleared SoftReferences the
number of symbols drops below 25% of the table's load factor threshold.
git-svn-id: https://svn.apache.org/repos/asf/xerces/java/trunk@1155386 13f79535-47bb-0310-9956-ffa450edef68
---
.../xerces/util/SoftReferenceSymbolTable.java | 40 ++++++++++++++-----
1 file changed, 31 insertions(+), 9 deletions(-)
diff --git a/src/org/apache/xerces/util/SoftReferenceSymbolTable.java b/src/org/apache/xerces/util/SoftReferenceSymbolTable.java
index aebe2f449..542bfb7da 100644
--- a/src/org/apache/xerces/util/SoftReferenceSymbolTable.java
+++ b/src/org/apache/xerces/util/SoftReferenceSymbolTable.java
@@ -200,12 +200,26 @@ public String addSymbol(char[] buffer, int offset, int length) {
* and load factor.
*/
protected void rehash() {
-
- int oldCapacity = fBuckets.length;
- SREntry[] oldTable = fBuckets;
-
- int newCapacity = oldCapacity * 2 + 1;
- SREntry[] newTable = new SREntry[newCapacity];
+ rehashCommon(fBuckets.length * 2 + 1);
+ }
+
+ /**
+ * Reduces the capacity of and internally reorganizes this
+ * SymbolTable, in order to accommodate and access its entries in
+ * a more memory efficient way. This method is called automatically when
+ * the number of keys in the SymbolTable drops below 25% of this
+ * hashtable's load factor (as a result of SoftReferences which have
+ * been cleared).
+ */
+ protected void compact() {
+ rehashCommon(((int) (fCount / fLoadFactor)) * 2 + 1);
+ }
+
+ private void rehashCommon(final int newCapacity) {
+
+ final int oldCapacity = fBuckets.length;
+ final SREntry[] oldTable = fBuckets;
+ final SREntry[] newTable = new SREntry[newCapacity];
fThreshold = (int)(newCapacity * fLoadFactor);
fBuckets = newTable;
@@ -312,9 +312,17 @@ public class SoftReferenceSymbolTable ex
*/
private void clean() {
SREntry entry = (SREntry)fReferenceQueue.poll();
- while (entry != null) {
- removeEntry(entry);
- entry = (SREntry)fReferenceQueue.poll();
+ if (entry != null) {
+ do {
+ removeEntry(entry);
+ entry = (SREntry)fReferenceQueue.poll();
+ }
+ while (entry != null);
+ // Reduce the number of buckets if the number of items
+ // in the table has dropped below 25% of the threshold.
+ if (fCount < (fThreshold >> 2)) {
+ compact();
+ }
}
}