1

Hibernate などのように JPA/ORM を使用する場合、Java Bean / POJO を定義して、それぞれの RDBMS テーブルにマップされるエンティティを表すのが一般的です。しかし、私が開発しようとしているプラ​​ットフォームでは、200,000 のそのようなエンティティをサポートする必要があります。標準の Spring MVC + Hibernate モデルを使用する必要がある場合、20 万のモデル POJO、20 万の DAO クラス、およびビューで表示可能な形式のデータを含む別の 20 万程度の JavaBean を作成することになる可能性があります。これは、Spring、Hibernate、およびその他の多くのライブラリで必要とされるクラスに加えて、約 600K の Java クラスに相当します。各 POJO モデル クラスに 10 個の String インスタンス変数と、それに対応する getter/setter があるとします。ここで、これらすべてのクラスをロードするために必要な PermGen スペースの量を知りたいと思います。

PermGen スペースのオーバーヘッドを見つける最良の方法は何ですか? クレイジーなアイデアの 1 つは、これらの 200K クラスを生成し、それらをロードし (ただし、それらのインスタンスを作成しないでください)、プロファイラーを実行して「インスタンスのないクラス」メトリックを識別し、permgen サイズを取得する方法をプログラムを作成することです。

実際、フィールド対値マップの java.util.Map だけで必要なことを実行できる、より単純なソリューションも探しています。ここで、フィールドには、RDBMS テーブル/列マッピングに関するメタデータが含まれ、JDBC CRUD ステートメントを生成します (新しいクラスのオーバーヘッドがないJOOQ.org )。

目標は、リフレクションをあまり使用せずにショーを実行し、データを運ぶだけのクラスをロードしすぎることです!!

この問題に関するヘルプは本当に感謝しています。

4

2 に答える 2

1

あなたが示唆するように、影響は PermGen スペースがすぐに使い果たされ、OutOfMemoryException が発生することです。これだけ多くのクラスがあると、アプリを起動する前に、デフォルトの JVM 設定を使用してメモリ不足になる可能性があります。(メモリ内のクラスの実際のサイズを見積もる方法については、 The Java Specialists' Newsletter のIssue 142 を参照してください。)

もちろん、permgen スペースをデフォルト (低い - 80M のような IIRC ですが、このソースが見つかりません) からコマンド ラインを介して増やすことができます-XX:MaxPermSize=256M。ただし、それだけ多くのクラスを使用すると、数ギガバイトの PermGen スペースが必要になります。私たちのアプリは 1,000 をわずかに超えるクラスを使用しており、すでに OOME を観察しているため、PermGen のスペース制限を 128M に引き上げる必要がありました。言うまでもなく、その多くのクラスのメンテナンスは悪夢になるでしょう...

したがって、結論として、別のアプローチを見つける方がよいでしょう。

于 2012-04-21T10:08:38.197 に答える
1

必要な perm gen スペースの合計を実際に指摘するのは非常に難しいと思います。使用を続けると、視覚的な vm または jmap を実行すると、ロードされたクラスの量を示すことができます。また、これほど大規模なアプリケーションを扱っていて、約 2048 MB の perm gen スペースを割り当てていましたが、その後も制約に遭遇しました。c3po の使用と組み合わせて、すべてがアクティブで、同時に稼働しているわけではないので、遅延読み込みを調べることができます。

于 2012-04-21T10:12:23.227 に答える