为什么Ehcache会将它存储在内存中的字符串大小加倍?

时间:2017-01-16 18:15:22

标签: ehcache

在尝试缓存一些几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();
    }
}   

将输出:

  

大小:1

     

inMemorySize:2097384

     

字符串大小: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>

1 个答案:

答案 0 :(得分:2)

Java中的字符串使用2字节字符。 Ehcache的规模并没有翻倍。当您调用toBytes()时,您将获得编码的字节(在这种情况下,使用默认的UTF-8编码)。这就是你看到差异的原因。