15

お願いします...次のスプリングポイントカット指定子の使用の違いは何ですか?

「ポイントカット指定子内」の使用:

<aop:pointcut expression="within(my.app.dao.impl.*)" id="commonDaoOperation"/>

「実行ポイントカット指定子」の使用:

<aop:pointcut expression="execution(public * my.app.dao.impl.*.*(..))" id="commonDaoOperation"/>

私は自分の Web プロジェクトで 2 番目のものを使用しています (そして、それが最も使用されていると思います)。このアプローチで見つかった問題は、ヒープで多くのメモリを消費していることです...

「Eclipse メモリ アナライザー」を使用してアプリケーション サーバーの「ヒープ ダンプ」を分析したところ、アプリケーションが 450 MB を消費しており、クラスのインスタンスが 450 MB の"org.springframework.aop.aspectj.AspectJExpressionPointcut30% を消費していることがわかりました...

の各インスタンスはAspectJExpressionPointcut(約) 6 MB を占めます。これは、各インスタンスが java.lang.reflect.Method のインスタンスと一致するキャッシュを保持し、驚くべきことにキャッシュされた Java メソッドが多数あるためです (私のポイントカット式では言及されていないメソッド)。

Spring のドキュメントを読んだ後、最初の 1 つのアプローチ (ポイントカット指定子内) を使用することにしました。これにより、各インスタンスがAspectJExpressionPointcut占有するメモリがはるかに少なくなりました。

問題はそれについてです...それらのパフォーマンスの違いは何ですか...

よろしくお願いします...

4

2 に答える 2