JSPのリロードに関してTomcatでクラスのリロードはどのように機能しますか(内部アーキテクチャについて話しています)?
各JSPがJavaクラスにコンパイルされていることを私は知っています。しかし、クラスローダーがクラスのアンロードを許可せず、ガベージをあまり収集しない場合、クラスローダー(Webアプリケーションごとに一意)はこれらの生成されたクラスをどのようにリロードしますか?
JSPのリロードに関してTomcatでクラスのリロードはどのように機能しますか(内部アーキテクチャについて話しています)?
各JSPがJavaクラスにコンパイルされていることを私は知っています。しかし、クラスローダーがクラスのアンロードを許可せず、ガベージをあまり収集しない場合、クラスローダー(Webアプリケーションごとに一意)はこれらの生成されたクラスをどのようにリロードしますか?
JasperLoader インスタンスは、jsp によって生成されたサーブレットをロードするクラスローダーです。
jsp コンパイラは、新しいサーブレット クラス ファイルを生成するときに、古い JasperLoader インスタンスを「破棄」(null に設定) します。
JspServletWrapper.setServletLastModifiedTimeのコメントからの引用:
本当に古いクラスをアンロードする必要がありますが、それはできません。JspLoader を破棄する次善の策を実行して、新しいクラスをロードする新しいローダーが作成されるようにします。
コンパイル後にこのメソッドが呼び出される場所も参照してください。
標準のJavaクラスローダーがクラスをアンロードすることはありません。Tomcatには独自のクラスローダーがあり、クラスの古いインスタンスを新しいインスタンスに置き換えてから、古いインスタンスを孤立させて、通常の方法でガベージコレクターが利用できるようにします。
どこかで、クラスが特定の期間使用されない場合、Tomcatがそれをアンロードすることを読みました。しかし、現時点ではその参考資料を見つけることができません。
教育が必要な場合は、コードを読んでください。
ここから始めてください: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/jasper/servlet/JspServlet.java?view=markup