一般的に問題が実際にいること持つクラスを阻止しようとしたJavaのセキュリティモデルでありますすでにロードされています。
もちろん、Javaは当初から動的クラスローディングをサポートしていましたが、クラス再ロードは難しいです。
実行中のJavaアプリケーションに悪意のあるコードを含む新しいクラスが注入されていることが有害である(と理由がある)と考えられました。たとえば、インターネットからのjava.lang.Stringクラッキングされた実装では、文字列を生成する代わりに、メソッドlength()を呼び出すランダムなファイルが削除されます。
したがって、Javaは考えられました(そして、結果的に.NET CLRと思われます。これは、JVMの "インスピレーション"が高いためです)。すでにロードされているクラスが同じVMを再びロードするのを防ぐためでした。
彼らはこの「機能」を無効にする仕組みを提供しました。クラスローダーは、クラスローダーのルールでも、新しいクラスをロードしようとする前に "親"クラスローダーに許可を求めてください。親クラスが既にクラスをロードしている場合、新しいクラスは無視されます。例えば
私は、アプリケーション・サーバーは、Java EEのための主流になった(ともマイクロコンテナの必要性を作成するときに
はホットデプロイは、Javaの世界で必要となりLDAPやRDBMSからクラスをロードするクラスローダーを使用していましたこの種の負担を避けるために春のように)。
すべてのコンパイル後にアプリケーションサーバー全体を再起動すると誰もが狂ってしまう。
アプリサーバープロバイダは、この「カスタム」クラスローダーを提供してホットデプロイメントを支援し、設定ファイルを使用することで、その動作を本番環境で設定すると無効にするべきです(SHOULD)。しかし、トレードオフは、開発に膨大なメモリを使用しなければならないということです。したがって、これを行う良い方法は、3〜4回の展開ごとに再起動することです。
これは、最初からクラスをロードするように設計された他の言語では発生しません。
たとえば、実行中のクラスにメソッドを追加したり、実行時にメソッドをオーバーライドしたり、固有の特定のオブジェクトに単一のメソッドを追加することさえできます。
これらの種類の環境でのトレードオフはもちろんメモリとスピードです。
こちらがお役に立てば幸いです。私はリロードが可能な限りシンプルにあることを約束するいくつかの時間前にこの製品を見つけた
EDIT。私は最初にこの答えを書いたときにリンクを覚えていませんでした。
これは、Sun JVMが宇宙固定PermGenたJavaRebel from ZeroTurnaround
ところで、このコミュニティWikiはなぜですか? – Eddie
私は不明なものを残した場合に役立つと思っていました...デフォルトでは、それは悪い礼儀ですか? –
おかしい:ちょっと今、再読書中にthink-oを見つけた、ありがとう! –