2016-09-22 9 views
0

なぜクラスオブジェクトがクラスローダーによって参照されるのですか?それはすなわち、クラスローダ他の方法で回避すべきではない と呼ばれている必要がありますクラスオブジェクトが到達不能およびより少ないメモリ消費量である場合ので、クラスオブジェクトは、GCの対象になっているだろうか?クラスローダによって参照されるクラスオブジェクト?

私は、私は基本、ここではなく、必ず何いくつかのことをしないのです知っています。私はそれをグーグルで試みたが、ClassLoaderロードクラスとその責任は、それがロードされたかのクラスを知ることであるため

+0

class loaderはシステムのフィールドメソッドなどのメモリにクラス構造の詳細を実際に格納するJVMの一部であり、実際に操作を実行するメモリ内のそのクラス構造のミラーコピーです。 –

答えて

2

答えが見つかりませんでした。 ClassオブジェクトはそれをロードClassLoaderを参照し、ClassにおけるしたがってgetClassLoader()方法を有しています。

メモリ消費量がの場合は絶対に何もありませんここに何かするのはどういうことかと想像できません。

+0

Ok私は別の方法で入れてみましょう。誰がそれをロードしたのかを知ることは、クラスオブジェクトだけの責任ではないはずです(既に言いましたように、つまりClassオブジェクトはそれをロードしたClassLoaderへの参照を持っています)。それが到達できなかった場合、到達不能なクラスオブジェクトはGCに到達できなかった可能性があります(クラスオブジェクトが到達不能であっても現在はbecozですが、クラスローダーによって参照されているためGCしません)。 – emilly

+1

いいえ、そうしてはいけません。クラスのアンロードは、少なくともメモリの観点からはあまり重要ではありません。しかし、どのクラスがロードされたかを知る 'ClassLoader'は非常に重要なので、例えば同じクラスを2回ロードすることはありません。あなたはGCingクラスについて非常に執拗です。心配する必要はありません。現状でも可能で簡単です。 – Kayaman

+0

@ Kayaman ClassLoaderがどのクラスが既にロードされているかを知る必要がありますが、クラスローダーがこれらのクラスへの参照を保持しているとは限りません。 –

0

あなたはクラスはjava.lang.ClassLoaderの実装を見れば、あなたはClassオブジェクトの実際のインスタンス化は、JVMによって「舞台裏」が起こることがわかります。クラス情報はネイティブメソッド(findLoadedClass0など)によって取得され、ClassLoaderはネイティブメソッドdefineClass1を呼び出して必要なときに新しいクラスを定義します。これらのメソッドの実装方法は、JVMによって異なります。

したがって、それは、オブジェクトのインスタンス化のためにこれらの参照を維持する必要はありません。状態ははjava.lang.ClassLoaderのソースコード内のClassオブジェクトのベクトルにコメントとしてしかし、:

// The classes loaded by this class loader. The only purpose of this table 
// is to keep the classes from being GC'ed until the loader is GC'ed. 
// private final Vector<Class<?>> classes = new Vector<>(); 

結果は、未使用のクラス定義のメモリを解放する必要がある場合、あなたはClassLoaderをGCに必要があるということです自体。そのクラスローダーによってロードされたクラスへの参照を含むオブジェクトがなく、そのクラスローダーへの参照を忘れることができます。これは、JEEアプリケーションサーバーとOSGiコンテナがWebアプリケーションとプラグインをアンロードするときに起こっていることです。

+1

それは気にするべきことではありませんが、あなたの最初の文は[絶対に真実ではありません](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/ lang/ClassLoader.java#180)。 – Kayaman

+0

ありがとう、私はそれに気付かなかった。 –

関連する問題