Flex4.6 との通信には BlazeDS 4 が使用されます。Flex クライアントが blazed サーバーでリモート呼び出しを呼び出すと、サーバーは POJO を含む arrayList を返します。各 POJO mem サイズが 12 バイトであると仮定すると、arrayList のサイズは 12*要素数になると予想されます。ただし、ブレーズドのどこかで、複数回複合されていることがわかります。配列リストに 200000 個の POJO を追加すると仮定すると、そのサイズは ~2MB になると予想されます。しかし、プロファイラーを通して、JVM が元のサイズの N 倍になり、同じ N 倍のメモリがフレックス ブラウザー アプリケーションにも転送されていることがわかりました。以下にリストされているのは、jmap プロファイラー キャプチャを使用した問題を示すサンプル コードです。必要に応じて、フレックス コードも提供させていただきます。
List list = new ArrayList();
for(i=0;i<200000;i++)
{ SampleClass sampleClassObj = new SampleClass();
sampleClassObj.setId(1);
sampleClassObj.setAge(20);
list.add(sampleClassObj);
}
return list;
また、SampleClass クラスの定義は次のとおりです。
public class SampleClass
{
long id;
int age;
// getters and setters for each variables
}
メモリは、jdk パスに存在する jmap.exe でプロファイルされます。クライアントからのリクエストを受け取る前の JVM の詳細メモリは、約 50MB でした。クライアントからのリクエスト前の jmap からの出力。
num #instances #bytes クラス名
1 63135 8497488 constMethodKlass
2 65671 7858440 [C
3 91344 5217976 symbolKlass
.
.
合計 658429 50097416 //JVM の初期メモリ
リクエストを処理した後の jmap からの出力。
num #instances #bytes クラス名
1 11402 20225512 [B
2 200000 1948809 SampleClass //予想どおり ~2MB
3 62734 8451040 constMethodKlass
.
.
合計 1175132 93938272 //ガベージ コレクションされていない JVM で消費されたメモリ。
奇妙なことに、Flex から同じメソッドを繰り返し呼び出そうとしても、それに応じて JVM メモリが増加しません。JVM で見られる数倍の増加は初めてです。ただし、フレックス クライアント アプリケーションのメモリは、呼び出しごとに増加し続けます。
YourKit プロファイラーで同じことを実行してみて、GC を何度も呼び出してみましたが無駄でした。
ブレイズド内で何が起こっているのか、誰かが私に理解させてくれませんか。