2009-07-15 16 views
1

実行時にJavaバイトコードを生成する可能性を考えています(クラスファイル経由ではなく、直接メモリに直接アクセスすることをお勧めしますが、質問)。実行時生成コードのJavaガベージコレクション

私はこれを行うことができると理解していますが、ガベージコレクタは使用されていないコードを掃除しますか?私は何年も前にそれがそうではないと主張していることを覚えていますが、私は今話題への参照を見つけることができません。

この目的を明確にするために、私は通常のデータ処理シナリオでは気にしません。しかし、遺伝的プログラミングを考えてみましょう。何十億もの小さなプログラムが生成され、そのシナリオでは、可能な限り速く実行しようとする価値があり、使用されなくなったコードを解放することが重要です。私はもっ​​と複雑なことをしようとしていますが、遺伝的プログラミングと似ています。

+0

あなたの例(多数の小規模なクラス)を考えると、私はJavaクラスを含まないソリューションを検討することをお勧めします。これらの各クラスのクラスローダーを作成するオーバーヘッドは極端に大きくなります。代わりに、ある種の自宅通訳を見てください。 – kdgregory

+0

しかし、単一のクラスローダーを作成して多数のクラスに使用することはできません。そして、ローダーへのすべての参照を削除すると、それらを一度に解放できますか? – rwallace

+0

はい - 一部を残し、他の人を捨てる(遺伝子アルゴリズムのように)ことは望ましくないという条件で提供されます。 – kdgregory

答えて

4

クラスは、クラスをロードしたClassLoaderに関連付けられています。 JVMに未使用のクラスを収集させるには、クラスローダーへのすべての参照をクリアする必要があります。これは、アプリケーションサーバーが「ホットデプロイ」で動作する方法であり、クラスローダーに精通していない場合は、JBossやTomcatの実装を見るのが有益でしょう(私はどちらも見ていないので、 。

本当にこれが問題になるのでしょうか?作成するクラスはどれくらいあり、どれくらい大きく、どれだけ長く生きるのですか?あなたが大規模なクラス(バイトコード以上の50k)をたくさん持っていて、それらが短時間で生きるなら、それらをきれいにするのは理にかなっています。そうでなければ、そうではありません。

また、なぜクラスを作成していますか? JVMの中からスクリプト言語(Rhinoなど)でできることはありますか?または自宅通訳者ですか?はいの場合、コードなしでクラス管理の問題を解決できます。

0

クラスがをガベージコレクタによってアンロードにすることを意味する場合、それはありません。

ただし、カスタムクラスローダーを作成することでこれを達成できます。

関連する問題