Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/StringCache.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/StringCache.java (revision 1724997) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/StringCache.java (working copy) @@ -26,6 +26,7 @@ import com.google.common.base.Function; import org.apache.jackrabbit.oak.cache.CacheLIRS; import org.apache.jackrabbit.oak.cache.CacheStats; +import org.apache.jackrabbit.oak.commons.StringUtils; /** * A string cache. It has two components: a fast cache for small strings, based @@ -83,8 +84,7 @@ cache.put(key, s, getMemory(s)); } if (FastCache.isSmall(s)) { - key.setString(s); - fastCache.addString(hash, key); + fastCache.addString(hash, key.withValue(s)); } return s; } @@ -98,7 +98,7 @@ } private static int getMemory(String s) { - return 100 + s.length() * 2; + return StringUtils.estimateMemoryUsage(s) + 52; } private static int getEntryHash(long lsb, long msb, int offset) { @@ -170,7 +170,7 @@ private final int hash; private final long msb, lsb; private final int offset; - private String string; + private final String string; StringCacheEntry(int hash, long msb, long lsb, int offset, String string) { this.hash = hash; @@ -180,11 +180,11 @@ this.string = string; } - void setString(String string) { + StringCacheEntry withValue(String string) { if (string == null) { throw new NullPointerException(); } - this.string = string; + return new StringCacheEntry(hash, lsb, msb, offset, string); } boolean matches(long msb, long lsb, int offset) {