2017-01-16 6 views
0

数MBのオブジェクトをキャッシュしようとしているうちに、キャッシュされたままEhcacheがサイズを倍増することがわかりました。Ehcacheがメモリに格納する文字列のサイズを2倍にするのはなぜですか?

どうしてですか?それは最適化ですか?キャンセルできますか?

次のコード

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ファイル:Javaで

<?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

generateDummyString関数でユニコード文字を使用してみてください。 – sgmoore

+0

@sgmoore試してみましたが、何も変わりませんでした。また、私はバイトの文字列のサイズとメモリサイズの両方をチェックしているので、文字列のサイズが2倍になったら、気づいたでしょう。 – Flowryn

答えて

2

文字列が2バイト文字を使用します。 Ehcacheはサイズを倍にしていません。 toBytes()を呼び出すと、エンコードされたバイトが取得されます(この場合、デフォルトのUTF-8エンコーディングが使用されます)。これが違いを見る理由です。

+0

Martin Serranoありがとうございました。私はその点を忘れていました。 toBytes()を呼び出して項目を格納すると、問題が解決しました。 – Flowryn

関連する問題