2009-07-19 8 views
5

Javaでマルチスレッドクラスローダーを実装することは可能ですか?メタ駆動のフレームワークでは、数百のクラスをあらかじめロードする必要があります。つまり、システムクラスローダーほど遅くはありません。これを加速するために、現在のマルチコアCPUをより有効に活用したいと考えています。私がそれに没頭する前に、誰かがすでにこの問題についていくつかの経験を持っている場合や、多分おそらくdefineClass()がこの場合のボトルネックであることが完全に明らかであれば興味があります。マルチスレッドのクラスローディングは可能ですか?

おかげ アンドレ

答えて

6

私は現在あなたが排他的なロックをヒットすると信じています。 JDK7では、クラスローダはパラレル対応であるとマークすることができます。

これまでのように、私はいくつかのバック・オブ・エンベロープ計算を行い、次にそれを吸い取ることを提案します。

+0

OK、 JDK 7.0クラスローダーAPI JDK <7.0のロックで正しいとすれば、少なくともファイルシステムからのバイトコードの並列読み込みとそれを前処理する利点があるかもしれません。私はこれが私の目的のために十分であるかどうかを確認するためにいくつかのテストを行います。 –

+1

リンクはhttp://openjdk.java.net/groups/core-libs/ClassLoaderProposal.htmlです。私はそれよりも最新のものは知らない。 –

+0

おかげでトムは、方向と現在の状況を示す非常に包括的なリンク。 –

0

あなたがプリロードする必要があるすべてのクラスを必要とし、バックグラウンドでクラスをロード一個の以上のスレッドを持つことには何も問題はありません。 ExecutorとCallablesでプロトタイプを作成して、jvisualvmでプロファイリング情報を取得できます。

+1

はい、技術的には、クラスをロードする複数のスレッドを持つことが可能でなければなりません。 defineClass()メソッドは同期されていません。これは前提条件の一種です。しかし、JVMコードのどこかにシンクポイントがあるのであれば、本当のMTクラスローディングを防ぐことができますか? –

+1

JVMによってクラスローディングがシングルスレッドとして定義されているため、defineClassは同期されません。 (Java 5および6では少なくとも)数百のクラスは、ロードするのに必要な時間枠を読み込むのにそれほど時間がかかりません。 –

+0

私は基本的に私のフレームワークは、非常にうまく拡張できないアーキテクチャに基づいていることだけを恐れています。 100sのクラスはほんの始まりですが、フレームワークがますます多くの機能を獲得するにつれて、クラスの数が数千に増え、起動時に深刻な遅延につながる可能性があります。 –

関連する問題