[Seasar-user:19292] Re: ライブラリの格納先について

奥野 守 [E-MAIL ADDRESS DELETED]
2010年 2月 12日 (金) 09:41:35 JST


小林様、ひが様

お世話になっております。奥野です。

> HOT deployと書いてますが、Seasar2のHOT deployのことではなく 
> JBossを稼働させたままdeployするJBossのdeployのことですよね。 
はい、上記となります。(不十分な記載となっており申し訳ありません。)
  

> 以上の結果から,SAStruts + S2JDBC の最低限の
> アプリケーションは Tomcat から問題なくアンデプロイ
> できています.
> 
> そちらのアプリ + JBoss でも同じように確認してみてください.
> 
> ロードされたクラスとアンロードされたクラスのマッチングは
> 次のようなクラスを作って行ったので参考にどうぞ.
Tomcatでのご確認、およびソース提示していただきありがとうございます。
教えていただいた手順を参考に、アンロードされてないクラスの確認を
行いたいと思います。

JBoss固有の問題かもしれませんが、進展がありましたら
再度ご連絡させていただきたいと思います。

以上、よろしくお願いいたします。


----- Original Message -----
On 03:00 PM 02/11/2010 Koichi Kobayashi 作成:
> 小林 (koichik) です.
> 
> Date:    Wed, 10 Feb 2010 12:00:58 +0000
> From:    "奥野 守" <[E-MAIL ADDRESS DELETED]>
> To:	   [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:19277] Re: ライブラリの格納先について
> 
> > パターン2:
> > ・[ライブラリ]をWEB-INF/libにのみ格納する。
> >   (jboss配下には格納しない)
> > 
> > 結果2:
> > ・hotdeploy(再配備)時、クラスのアンロードが行われるものの、
> >   数回再配備を繰り返すとOutOfMemoryError(PermGen space)
> >   # アンロードできているクラス/できていないクラスの詳細は
> >	まだ確認できていない状態です。
> 
> Dolteng で作成した SAStruts + S2JDBC のアプリと
> Tomcat 6.0.24 の組み合わせを以下の手順で確認しました.
> 
> 
> 1.Tomcat の JVM 起動オプションに -verbose:class を指定し,
> VisualJVM を起動しておく.
> 
> 2.Tomcat を起動して SAStruts + S2JDBC アプリの
> 画面を開く.
> 
> 3.VisualJVM で Heap Dump を取得し,Tomcat の 
> WebappClassLoader のインスタンスに該当 Web アプリを
> ロードした WebappClassLoader が含まれていることを確認.
> (jarNames フィールドの内容から判断できます)
> 
> 4.管理画面から SAStrtus + S2JDBC アプリをアンデプロイする.
> 
> 5.すぐにはアンロードされないので,VisualJVM から
> GC を何度か発生させる.
> 
> 6.VisualJVM の Heap Dump を取得し,Tomcat の 
> WebappClassLoader のインスタンスに該当 Web アプリを
> ロードした WebappClassLoader が含まれていない (GC された)
> ことを確認.
> 
> 7.-verbose:class のログから,ロードされたクラスと
> アンロードされたクラスのマッチングを行い,該当アプリに
> 含まれるクラスが残ってないことを確認.
> 
> 
> 以上の結果から,SAStruts + S2JDBC の最低限の
> アプリケーションは Tomcat から問題なくアンデプロイ
> できています.
> 
> そちらのアプリ + JBoss でも同じように確認してみてください.
> 
> ロードされたクラスとアンロードされたクラスのマッチングは
> 次のようなクラスを作って行ったので参考にどうぞ.
> # こういう時に LL 使わないと格好悪い気がするけどいいのだ.
> 
> ログを保存して実行すると,ロードされたのにアンロード
> されていないクラスがコンソールに出力されます.
> ファイルのパスとエンコーディングは実際に合わせてください.
> 
> public class ClassLeakTest extends TestCase {
>     Pattern loadPattern = Pattern.compile("\\[Loaded (\\S+) from
> (.*)]");
>     Pattern unloadPattern = Pattern.compile("\\[Unloading class
> (\\S+)]");
> 
>     public void test() throws Exception {
>	  BufferedReader r = new BufferedReader(new InputStreamReader(
>	      new FileInputStream("log.txt"),
>	      "Shift_JIS"));
>	  Map<String, String> map = new HashMap<String, String>();
>	  String line = null;
>	  while ((line = r.readLine()) != null) {
>	      Matcher matcher = loadPattern.matcher(line);
>	      if (matcher.matches()) {
>		  String className = matcher.group(1);
>		  String from = matcher.group(2);
>		  map.put(className, from);
>		  continue;
>	      }
>	      matcher = unloadPattern.matcher(line);
>	      if (matcher.matches()) {
>		  String className = matcher.group(1);
>		  map.remove(className);
>	      }
>	  }
>	  for (String className: map.keySet()) {
>	      System.out.println(className + " from " +
> map.get(className));
>	  }
>     }
> }
> 
> 
> -- 
> <component name="koichik">
>     <property name="fullName">"Koichi Kobayashi"</property>
>     <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
>     <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
> </component>



Seasar-user メーリングリストの案内