为什么 Ehcache 会将它存储在内存中的字符串的大小加倍?
Why does Ehcache double the size of Strings it stores in memory?
在尝试缓存一些几 MB 的对象时,我观察到 Ehcache 在保持缓存的同时将它们的大小加倍。
为什么会这样?是优化吗?可以取消吗?
以下代码:
public class Main {
public static void main(String[] args) {
CacheManager manager = CacheManager.newInstance();
Cache oneCache = manager.getCache("OneCache");
String oneMbString = generateDummyString(1024 * 1024);
Element bigElement = new Element("key", oneMbString);
oneCache.put(bigElement);
System.out.println("size: "+ oneCache.getSize());
System.out.println("inMemorySize: " + oneCache.calculateInMemorySize());
System.out.println("size of string: " + oneMbString.getBytes().length);
}
/**
* Generate a dummy string
*
* @param size the size of the string in bytes.
* @return
*/
private static String generateDummyString(int size) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++) {
sb.append("a");
}
return sb.toString();
}
}
将输出:
size: 1
inMemorySize: 2097384
size of string: 1048576
PS: ehcache.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="false" monitoring="autodetect" maxBytesLocalHeap="512M">
<cache name="OneCache"
eternal="false"
overflowToDisk="false"
diskPersistent="false"
memoryStoreEvictionPolicy="LFU">
<sizeOfPolicy maxDepth="10000" maxDepthExceededBehavior="abort"/>
</cache>
</ehcache>
Java 中的字符串使用 2 字节字符。 Ehcache 没有将大小加倍。当你调用 toBytes() 时,你会得到编码的字节(在这种情况下使用默认的 UTF-8 编码)。这就是您看到差异的原因。
在尝试缓存一些几 MB 的对象时,我观察到 Ehcache 在保持缓存的同时将它们的大小加倍。
为什么会这样?是优化吗?可以取消吗?
以下代码:
public class Main {
public static void main(String[] args) {
CacheManager manager = CacheManager.newInstance();
Cache oneCache = manager.getCache("OneCache");
String oneMbString = generateDummyString(1024 * 1024);
Element bigElement = new Element("key", oneMbString);
oneCache.put(bigElement);
System.out.println("size: "+ oneCache.getSize());
System.out.println("inMemorySize: " + oneCache.calculateInMemorySize());
System.out.println("size of string: " + oneMbString.getBytes().length);
}
/**
* Generate a dummy string
*
* @param size the size of the string in bytes.
* @return
*/
private static String generateDummyString(int size) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++) {
sb.append("a");
}
return sb.toString();
}
}
将输出:
size: 1
inMemorySize: 2097384
size of string: 1048576
PS: ehcache.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
updateCheck="false" monitoring="autodetect" maxBytesLocalHeap="512M">
<cache name="OneCache"
eternal="false"
overflowToDisk="false"
diskPersistent="false"
memoryStoreEvictionPolicy="LFU">
<sizeOfPolicy maxDepth="10000" maxDepthExceededBehavior="abort"/>
</cache>
</ehcache>
Java 中的字符串使用 2 字节字符。 Ehcache 没有将大小加倍。当你调用 toBytes() 时,你会得到编码的字节(在这种情况下使用默认的 UTF-8 编码)。这就是您看到差异的原因。