私の状況は、Grails 2.1.2 アプリケーションがあり、キャッシュ プラグインとcache-ehcache プラグインを実装として使用してメソッド レベルのキャッシュを導入したいということです。
私のキャッシュは、次のようにメモリ内に配置されるように構成されています。
grails.cache.config = {
cache {
name 'homePageCache'
enabled true
eternal false
pinning {
store 'localMemory'
}
}
私はこのようなメソッドを持っています.int引数のみを取るので、キー生成は問題ではありません:
@Cacheable('homePageCache')
TubeVideoPagingArray findHomePageOfVideos(int pageSize) {
私の問題は、java.lang.OutOfMemoryError: Java heap space
このメソッドが呼び出されたときに例外が発生したことです。その理由は、ehcache が ObjectGraphWalker と呼ばれるクラスを使用してキャッシュに入れられるオブジェクトのサイズを計算し、オブジェクト グラフを走査してサイズを合計するためです。
ehcache のデバッグ レベルのログを設定したところ、次のような膨大な数の行が表示されます。
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'bigDecimalMultiplier' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'digitList' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'positivePrefixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'positiveSuffixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'negativePrefixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'negativeSuffixFieldPositions' of class java.text.DecimalFormat
2014-04-17 13:27:13,470 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'currency' of class java.text.DecimalFormatSymbols
2014-04-17 13:27:13,488 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.converters.codecs.XMLCodec$__clinit__closure1
2014-04-17 13:27:13,491 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.URLCodec$__clinit__closure2
2014-04-17 13:27:13,492 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.URLCodec$__clinit__closure1
2014-04-17 13:27:13,494 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.SHA256Codec$__clinit__closure2
2014-04-17 13:27:13,495 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.SHA256Codec$__clinit__closure1
2014-04-17 13:27:13,498 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.JavaScriptCodec$__clinit__closure1
2014-04-17 13:27:13,501 DEBUG [org.ehcache.sizeof.ObjectGraphWalker] SizeOf engine walking transient field 'metaClass' of class org.codehaus.groovy.grails.plugins.codecs.MD5BytesCodec$__clinit__closure2
それが他のメタクラスにつながるメタクラスの束を横断することは明らかです..
Ehcache には、ここで説明されているこのサイズの計算を構成するメカニズムがあります: http://ehcache.org/documentation/configuration/cache-size#built-in-sizing-computation-and-enforcement
そして最近、バージョン 2.8 (私は 2.8.1 を使用) 以降、この構成用のプログラム API もあり、このライブラリを使用してセットアップできることがわかりました: https://github.com/Terracotta-OSS/ ehcache-sizeofengine
このサイズの Groovy エンジンの実装が参照されており、metaClasses トラバースを解決する必要があります。私はそれを試しましたが、私見では機能しません-その核心はこのフィルターです:
public void configure(final Filter filter) {
filter.ignoreInstancesOf(groovy.lang.MetaClass.class, false);
}
問題は、groovy オブジェクトの metaClass フィールドが MetaClass のインスタンスではないことだと思います。ログにも表示されます。
このような長い説明の後に質問を提起するには、次のようにします。
誰かが同じ問題に遭遇し、何とか解決しましたか?