JavaのGCに関する説明(WAS6.1のIBM JVMを元に説明する):
一、GCに対する理解:
1.GC発生頻度:ヒープサイズとアロケーション・レートに依存
2.GC時間の長さ:ヒープサイズとヒープ内のオブジェクト数に依存
二、GC方式に対する理解:
1.ヒープ領域確保の仕方
①Mark & Sweep GC
②Copying GC
2.GC実行時のGCスレッドとアプリケーションスレッド
①"Stop The Worlde"とはどういう意味?
そもそもGCは、オブジェクトのヒープ領域への割り当てが失敗した際 に、発生します。そして、GC処理が開始されると、GC処理を担当するスレッド 以外のスレッドは一時停止されます。それは、GC処理においてオブジェクトの 移動やリファレンスの走査などを行うため、アプリケーション処理がGCと並行 されることによるメモリ情報の整合性などの問題発生を防ぐためです。
GC処理開始から終了までの間、GC処理スレッド以外のスレッドが「一 時停止状態」になるため、一般に、これを“Stop The World”と呼んでいます。
②IBM JVMが提供する二種類のスレッド:
・Parallel Collector:
特徴:GC処理時間の短縮
Parallel Collectorとは、GC処理をマルチ・スレッドで実施するため、 GC処理時間の短縮が期待できます。CPU数の多い大規模システムで効果的であ るといえます。ただし、GC処理の間は、アプリケーション・スレッドは停止さ れます(“Stop The World”)。
・Concurrent Collector:
特徴:アプリケーション・スレッドの停止時間の短縮
3.分割ヒープ領域とフラットなヒープ領域
①フラットなヒープ領域:従来のモデル
②分割(Generational)ヒープ:
WAS6.1のIBM JVMから提供した短命オブジェクト向けのGCモデル
三、WAS6.1のAPサーバに対するJVM設定:
WAS管理コンソール→「サーバ」→「アプリケーションサーバ」に
対象APサーバの設定画面で右側のメニュー「Java及びプロセス管理」の
「プロセス定義」→「Java仮想マシン」画面を開く
この画面でJVMに対する設定を行う。
「汎用JVM引数」には、下記4種類のパラメータがある:
1.-Xgcpolicy:optthruput:
Throughputの最適化。
フラット・ヒープを採用。アプリケーションのスループット重視。
Parallel Collector(Stop The World)、Parallel Mark、Parallel Sweep
2.-Xgcpolicy:optavgpause:
Pause Timeの最適化。
アプリケーションのレスポンスを重視し、GCによる影響を抑える
フラット・ヒープを採用。Concurrent Collector(GCポーズタイムを最小化)、Concurrent Mark、Concurrent Sweep
3.-Xgcpolicy:gencon:
アプリケーションが生成するオブジェクトが短命である。
(Generational Concurrent)
分割ヒープを採用。Nursery AreaはParallel Collector(Stop The World)、
Copying GC。Tenured AreaはConcurrent Collector、Concurrent Mark、
Concurrent Sweep
4.-Xgcpolicy:subpool :
アプリケーションが多量のスレッドを使用し(大規模SMPマシン環境)、
多くのオブジェクトをアロケーション(Subpool)。
フラット・ヒープを採用。スループット重視。Parallel Collector
(Stop-the-world)、Parallel Mark、Parallel Sweep。大規模SMP環境用に
オブジェクト・アロケーション・アルゴリズムを最適化。AIX、Linux PPC、
zSeries、z/OS、i5/OSでのみサポート
2009年6月24日水曜日
EclipseでStruts1.3.10のWebアプリプロジェクトを作成手順
EclipseでStruts1.3.10のWebアプリプロジェクトを作成手順:
1.JDKをインストールして、JAVA_HOMEを環境変数に設定
2.Tomcatをインストールして、TOMCAT_HOMEを環境変数に設定
3.Eclipseを開いて、動的Webプロジェクトを新規作成
4.該当プロジェクトのビルド・パスにStrutsのjarファイルを追加
5.作成したプロジェクトのWarファイルを作成し、Tomcatのwebappsフォルダに配備
6.EclipseのTomcatを起動する
※もし下記ActionServletに関するエラーが出たら、
===============
- サーブレット action を利用不可能にマークします
- Error loading WebappClassLoader
===============
「ウィンドウ」→「Tomcat」→「拡張」にある「JavaプロジェクトをTomcatのクラスパスへ追加」
のプロジェクトリストを切り替えてしたら、エラーを解消できる
7.Struts1.3のJSPにあるtablibの宣言方法に注意が必要です
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
これは、以前のバージョンと違う
8.Struts1.3は、Struts1.2より、いくつかの変更があるから、注意してほしい
例:1.2のstruts.jarを1.3のいくつかstruts-**.jarに分割する
ActionErrorをActionMessageに変更
1.JDKをインストールして、JAVA_HOMEを環境変数に設定
2.Tomcatをインストールして、TOMCAT_HOMEを環境変数に設定
3.Eclipseを開いて、動的Webプロジェクトを新規作成
4.該当プロジェクトのビルド・パスにStrutsのjarファイルを追加
5.作成したプロジェクトのWarファイルを作成し、Tomcatのwebappsフォルダに配備
6.EclipseのTomcatを起動する
※もし下記ActionServletに関するエラーが出たら、
===============
- サーブレット action を利用不可能にマークします
- Error loading WebappClassLoader
===============
「ウィンドウ」→「Tomcat」→「拡張」にある「JavaプロジェクトをTomcatのクラスパスへ追加」
のプロジェクトリストを切り替えてしたら、エラーを解消できる
7.Struts1.3のJSPにあるtablibの宣言方法に注意が必要です
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
これは、以前のバージョンと違う
8.Struts1.3は、Struts1.2より、いくつかの変更があるから、注意してほしい
例:1.2のstruts.jarを1.3のいくつかstruts-**.jarに分割する
ActionErrorをActionMessageに変更
アプリケーションの停止とスレッドの停止
アプリケーションの停止とスレッドの停止:
環境:
WAS6.1+WindowsXP
仕様:
スレッドは、Servletアプリケーションで呼ばれている
要求:
Websphereの管理コンソールであるServletアプリケーションを停止する
かつ、該当Servletアプリケーションが呼び出しているスレッドも停止する
現状:
Websphereの管理コンソールで対象Servletアプリケーションを停止しても、
該当Servletアプリケーションに呼ばれているスレッドの停止ができない
解決方法:
対象スレッドのrun()メッソドにあるwhile(true)ループに対して、常にループ
できるではなく、条件をつけるようにする。
1.対象スレッドに、下記変数と対応メッソドを定義する
private volatile Thread blinker;
public void setThreadObject(Thread blinker){
this.blinker=blinker;
}
2.run()にあるwhile(true){}に対して、下記のように条件をつける
Thread current = Thread.currentThread();
while (this.blinker==current) {}
3.Servletのinit()に変数blinkerの初期値と終了値を設定
this.qrViewWatcher.setThreadObject(this.qrViewWatcher);
4.Servletのfinalize()に変数blinkerの終了値を設定
this.qrViewWatcher.setThreadObject(null);
上記設定によって、Servletアプリを停止すると、該当アプリオブジェクトが呼び出した
スレッド対象のrun()が機能しないようになる(while(){}を実行しない)。
また、Servletアプリを始動すると、新しいIDを持っているスレッドが動作する
(元のスレッドは、一定時間に経って、GCより回収されるかな?)
これで、Servletアプリの動作は、中にあるスレッドの動作と一致される。
※もちろん、TomcatのようにWebsphereAPサーバを停止すれば、スレッドも一緒に停止される
環境:
WAS6.1+WindowsXP
仕様:
スレッドは、Servletアプリケーションで呼ばれている
要求:
Websphereの管理コンソールであるServletアプリケーションを停止する
かつ、該当Servletアプリケーションが呼び出しているスレッドも停止する
現状:
Websphereの管理コンソールで対象Servletアプリケーションを停止しても、
該当Servletアプリケーションに呼ばれているスレッドの停止ができない
解決方法:
対象スレッドのrun()メッソドにあるwhile(true)ループに対して、常にループ
できるではなく、条件をつけるようにする。
1.対象スレッドに、下記変数と対応メッソドを定義する
private volatile Thread blinker;
public void setThreadObject(Thread blinker){
this.blinker=blinker;
}
2.run()にあるwhile(true){}に対して、下記のように条件をつける
Thread current = Thread.currentThread();
while (this.blinker==current) {}
3.Servletのinit()に変数blinkerの初期値と終了値を設定
this.qrViewWatcher.setThreadObject(this.qrViewWatcher);
4.Servletのfinalize()に変数blinkerの終了値を設定
this.qrViewWatcher.setThreadObject(null);
上記設定によって、Servletアプリを停止すると、該当アプリオブジェクトが呼び出した
スレッド対象のrun()が機能しないようになる(while(){}を実行しない)。
また、Servletアプリを始動すると、新しいIDを持っているスレッドが動作する
(元のスレッドは、一定時間に経って、GCより回収されるかな?)
これで、Servletアプリの動作は、中にあるスレッドの動作と一致される。
※もちろん、TomcatのようにWebsphereAPサーバを停止すれば、スレッドも一緒に停止される
JavaでPL/SQLのパッケージに定義されているProcedureの呼び出す手順
JavaでPL/SQLのパッケージに定義されているProcedureの呼び出す手順:
1.該当Procedureを呼び出すSQL文の用意:
例:
String sql = "{ call PKG_TMP_RESULT.CREATE_TMP_RESULT(?,?) }";
説明:
①PKG_TMP_RESULT:PL/SQLのパッケージ名
②CREATE_TMP_RESULT:一時テーブルを作成するProcedure名
③"?":入力/出力パラメータ
2.DBに接続Connection対象の用意:
org.apache.commons.dbcp.DelegatingConnectionを使って、
Connectionオブジェクトを取得することをお勧め
※必要に応じて、特定なデータベース用のConnectionに転換する
例:
Connection tmpCon = ((DelegatingConnection)con).getInnermostDelegate();
oCon = (OracleConnection)tmpCon;
3.ストアドプロシージャを呼び出すためのCallableStatementオブジェクトを生成
※prepareCall(String sql)メソッドを使う
※必要に応じて、特定なDB用CallableStatementに変更
例:
CallableStatement stmt = oCon.prepareCall(sql);
OracleCallableStatement ostmt = (OracleCallableStatement)stmt;
※注意:
prepareStatement(String sql)は、パラメータ付きSQL文をデータベースに
送るためのPreparedStatementオブジェクトを作成します。
4.入力パラメータの設定:
CLOB clob = CLOB.createTemporary(oCon,true,oracle.sql.CLOB.DURATION_SESSION);
clob.setString(1, para1);
ostmt.setCLOB(1, clob);
説明:
①CLOB.createTemporary(java.sql.Connection conn,boolean cache,int duration)
該当メソッドは、一時のCLOBを作成
パラメータの意味:
cache - Specifies if LOB should be read into buffer cache or not.
duration - The duration of the temporary LOB.
The following are valid values: DURATION_SESSION, DURATION_CALL.
②clob.setString(long pos,String str)
指定するCLOBへ対象文字列をposの位置に書き込む
③ostmt.setCLOB(long pos,Clob clob)
oracle.sql.CLOBに指定位置でパラメータを含んでいるclob値を設定する
5.Procedureの実行結果を返す用出力パラメータの声明:
ostmt.registerOutParameter(2, Types.INTEGER);
※声明できるタイプ:
CHAR、VARCHAR、LONG、RAW、LONG RAW
6.ストアド・プロシージャの実行
ostmt.execute();
7.返すパラメータの取得:
ostmt.getXXX(long pos);
posは、パラメータのindex;
例:
int exec_stat = ostmt.getInt(2);
※補足:
Procedureの呼び出す側で指定したパラメータのindexは、
Procedureの定義側のindexと一致しないといけない
1.該当Procedureを呼び出すSQL文の用意:
例:
String sql = "{ call PKG_TMP_RESULT.CREATE_TMP_RESULT(?,?) }";
説明:
①PKG_TMP_RESULT:PL/SQLのパッケージ名
②CREATE_TMP_RESULT:一時テーブルを作成するProcedure名
③"?":入力/出力パラメータ
2.DBに接続Connection対象の用意:
org.apache.commons.dbcp.DelegatingConnectionを使って、
Connectionオブジェクトを取得することをお勧め
※必要に応じて、特定なデータベース用のConnectionに転換する
例:
Connection tmpCon = ((DelegatingConnection)con).getInnermostDelegate();
oCon = (OracleConnection)tmpCon;
3.ストアドプロシージャを呼び出すためのCallableStatementオブジェクトを生成
※prepareCall(String sql)メソッドを使う
※必要に応じて、特定なDB用CallableStatementに変更
例:
CallableStatement stmt = oCon.prepareCall(sql);
OracleCallableStatement ostmt = (OracleCallableStatement)stmt;
※注意:
prepareStatement(String sql)は、パラメータ付きSQL文をデータベースに
送るためのPreparedStatementオブジェクトを作成します。
4.入力パラメータの設定:
CLOB clob = CLOB.createTemporary(oCon,true,oracle.sql.CLOB.DURATION_SESSION);
clob.setString(1, para1);
ostmt.setCLOB(1, clob);
説明:
①CLOB.createTemporary(java.sql.Connection conn,boolean cache,int duration)
該当メソッドは、一時のCLOBを作成
パラメータの意味:
cache - Specifies if LOB should be read into buffer cache or not.
duration - The duration of the temporary LOB.
The following are valid values: DURATION_SESSION, DURATION_CALL.
②clob.setString(long pos,String str)
指定するCLOBへ対象文字列をposの位置に書き込む
③ostmt.setCLOB(long pos,Clob clob)
oracle.sql.CLOBに指定位置でパラメータを含んでいるclob値を設定する
5.Procedureの実行結果を返す用出力パラメータの声明:
ostmt.registerOutParameter(2, Types.INTEGER);
※声明できるタイプ:
CHAR、VARCHAR、LONG、RAW、LONG RAW
6.ストアド・プロシージャの実行
ostmt.execute();
7.返すパラメータの取得:
ostmt.getXXX(long pos);
posは、パラメータのindex;
例:
int exec_stat = ostmt.getInt(2);
※補足:
Procedureの呼び出す側で指定したパラメータのindexは、
Procedureの定義側のindexと一致しないといけない
WASの「セキュリティ」設定でWebshpere起動ができない問題
WASの管理コンソール画面で「セキュリティ」に関する設定を行って、
ローカルのDEBUG環境でWASが起動できなくないことがある
その時、フォルダ「C:\Program Files\IBM\SDP70\runtimes\base_v61\
profiles\AppSrv00\config\cells\mmh-sv99Node01Cell」
にある「security.xml」を編集して、中にあるタグ「security」の「enable」
をfalseに変更すると、WASが起動できるとなる
ローカルのDEBUG環境でWASが起動できなくないことがある
その時、フォルダ「C:\Program Files\IBM\SDP70\runtimes\base_v61\
profiles\AppSrv00\config\cells\mmh-sv99Node01Cell」
にある「security.xml」を編集して、中にあるタグ「security」の「enable」
をfalseに変更すると、WASが起動できるとなる
登録:
投稿 (Atom)
