0

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 を何度も呼び出してみましたが無駄でした。

ブレイズド内で何が起こっているのか、誰かが私に理解させてくれませんか。

4

1 に答える 1

1

デフォルトArrayListの容量は 10 個のオブジェクトです。現在の容量がなくなった場合に新しいオブジェクトを追加した後、リストは現在の容量の 50% で自己容量を増やします。多分これはメモリ好きの理由です。このドキュメントを読んでみてくださいhttp://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

于 2013-02-15T11:23:51.923 に答える