Application Server専用ページへもどる
■ASで使うヒープサイズの確認方法
・dmstool -JVM の結果を出力
activeThreadGroups.maxValue: 3.0 groups
activeThreadGroups.minValue: 1.0 groups
activeThreadGroups.value: 3 groups
activeThreads.maxValue: 19.0 threads
activeThreads.minValue: 6.0 threads
activeThreads.value: 19 threads
cpuTime.value: not implemented msecs
freeMemory.maxValue: 2405.0 kbytes
freeMemory.minValue: 94.0 kbytes
freeMemory.value: 620 kbytes ←★@
startTime.value: 1147931942519 msecs
timeStamp.ts: 1147948499457 milliseconds
totalMemory.maxValue: 5420.0 kbytes
totalMemory.minValue: 1984.0 kbytes
totalMemory.value: 5420 kbytes ←★A
upTime.value: 16556938 msecs
Host: abyss
Name: JVM
Parent: /
Process: OC4J_sample:OC4J:3301:6004
iasInstance: node1.abyss
uid: 218628247
A−@の結果がヒープメモリサイズ
totalMemory.value - freeMemory.value
例 5420 - 620 = 4800 kbyte 4.8M ヒープメモリ
・OEMの表示結果 4.93 M ほぼ同じ
----------------------------------------------------------------------------------------------
■java起動オプションの設定例
・ASのopmn.xmlファイルのjava-optionsの設定例
※10gR3の場合、opmnctl reloadでOK
9.0.4の場合、dcmctl updateConfig -ct opmn
【java-optionsの例】設定後OC4J再起動必要!
"-verbose:gc -verbose:class -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC
-server -Dclass.load.trace=loader+stack -Djava.security.policy=$ORACLE_HOME/j2ee/{OC4J}/config/java2.policy
-Djava.awt.headless=true -Dhttp.webdir.enable=false
-Xms128m -Xmx128m
-XX:PermSize=32m -XX:MaxPermSize=32m"
・説明
「-XX:+PrintGCTimeStamps」と「-XX:+PrintGCDetails」を指定することで、
それぞれGCのタイムスタンプとGCの詳細情報が得られます。
(例1) -verbose:gcのみ
[GC 2198K->150K(3520K), 0.0200894 secs]
意味:
・GCにより、トータルヒープ使用サイズが2198KBから150KBになった
・GCによる停止時間は0.0200894秒
(例2) -XX:+PrintGCTimeStamps、-XX:+PrintGCDetailsを指定
4.12082: [GC 4.12096: [DefNew: 2048K->0K(2112K), 0.0003650 secs] 2198K-}150K(3520K), 0.0004982 secs]
意味:
・アプリケーションを起動してから 4.12082秒経過
・New世代のガベージコレクションで New世代の使用サイズが2048KBから0KBになった
・マイナーコレクション(New世代のみを対象としたGC)による停止時間は0.0003650秒
・トータルヒープ使用サイズは2198KBから150KBになった
・全ガベージコレクションによる停止時間は0.0004982秒
またその他の主要なGC関連オプションとして、以下のようなものがあります。
オプション 得られる情報
-Xloggc:filename GC情報をファイル出力
-XX:+PrintTenuringDistribution オブジェクトの年齢情報
-XX:+TraceGen0Time New世代の累積GC回数、総時間、平均時間
-XX:+TraceGen1Time Old世代の累積GC回数、総時間、平均時間
-XX:+PrintHeapAtGC GC前後のヒープ情報
※ひととおり出力情報を参照しておくと後々役立つでしょう。
●出力先 指定例
java起動オプションは以下のように指定。
-server -XX:+PrintGCDetails -Xloggc:./log/garbage.log -XX:NewSize=128m -
XX:MaxNewSize=128m -XX:PermSize=128m -XX:MaxPermSize=128m -Xms512m -
Xmx512m -Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy -
Djava.awt.headless=true
(UNIX)
-Xloggc:/tmp/gc.log
(WINDOWS)
-Xloggc:e:\temp\gc.log
■起動中のOC4Jのjavaオプションを知る方法
opmnctl status で pid を取得し、
/usr/ucb/ps -auxwwwl | grep {pid} で詳細が出る。
■OutofMemoryエラーに関連するログ(AS上のログ)
・ipm.log ($ORACLE_HOME/opmn/logs の配下)
AJP通信でのpingが失敗し続け、接続Failedになる様子。
05/06/16 14:46:21 ipm_oc4j_ping: reply missing from OC4J UID 484473 (retval 0)
05/06/16 14:46:38 ipm_oc4j_ping: reply missing from OC4J UID 484473 (retval 0)
05/06/16 14:47:03 ipm_oc4j_ping: reply missing from OC4J UID 484473 (retval 0)
05/06/16 14:47:14 oc4j ping: Failed to connect UID 484473 ←★Failed to connect
・application.log ($ORACLE_HOME/j2ee/{OC4J}/application-deployments/{APP}/OC4J_XXX_default_island_1 の配下)
05/06/16 8:03 node1: Servlet error
java.lang.OutOfMemoryError
{{no stack trace available}} ←★OutOfMemoryError
■sotimeoutオプションの有効性
ネットワーク断のようなソケット通信が途絶える場合は、早期のリソース解放に有効。
(設定例)
-Dajp.sotimeout=300000
設定する値はミリ秒単位。上記は300秒(5分)となる。
ソケット通信断の場合、5分後以降にタイムアウトとなる。
■Javaのヒープサイズ最大値
JDK1.4.*(32bit)JVMが使用できる最大のヒープサイズは最大4GBとなる。
JDKが64bitであれば4GB を超えたサイズをオプション(-Xmx)に指定できるが、
OS(Solaris)が64bit環境なら理論上 18 ExaByteとなるが、実際には搭載されている物理メモリ量に依存する。
オプション(-Xmx)に指定したヒープ最大サイズにはJavaヒープ以外の領域も含まれる。
例:4GBの内訳
<--------------32 bit process, 4G memory space------------------------>
<-- Java heap ---------><--Permanet ---><---Native(Java process/GC)--->
・Java heap領域は-Xmxや-Xmsパラメータで指定した領域。
※クラスから作成されたオブジェクト(バイトコード)が置かれる領域
・Permanet領域は-XX:MaxPermSizeパラメータで指定した領域でクラスの静的情報(バイトコード)が入る。
※静的情報には、staticメソッドや、static 宣言されている変数や定数が置かれている。
・Native領域はJavaスレッドのスタックやJVM自身のスタック、JVMが利用するCヒープ領域が存在。
このほかにもコードキャッシュ(バイトコードをコンパイルしたネイティブコード)やJavaインタプリタ、
動的コンパイラ、ガーベジコレクタが含まれている。
スレッドスタックを監視する方法として、pmap、pstackコマンドがある。
CヒープはNative領域に含まれているが、Native領域のサイズを調べたり、モニターする方法は無い。
■JDBCドライババージョンの確認するサンプルプログラム
import java.sql.*;
import oracle.jdbc.driver.*;
class version {
public static void main (String args []) throws SQLException{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@aix:1521:nsdb", "scott", "tiger");
DatabaseMetaData meta = conn.getMetaData ();
System.out.println("JDBC driver version is " + meta.getDriverVersion ());
}
}
・実行例
D:\j2sdk1.4.2_08\bin\javac.exe H:\archive\bin\version.java
JDBC driver version is 10.2.0.1.0
■JDBC接続でDBにアクセスするサンプルコード
------------------------- select Example ------------------------------------
import java.sql.*;
import java.sql.PreparedStatement;
import oracle.jdbc.driver.*;
//PreparedStatementを使用してSQLを実行する
class test {
public static void main (String args []) throws SQLException{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@aix:1521:nsdb", "system", "manager");
PreparedStatement pstm = conn.prepareStatement("SELECT instance_name FROM v$instance");
pstm.setEscapeProcessing(false);
ResultSet rset = pstm.executeQuery();
while(rset.next())
System.out.println(rset.getString(1));
rset.close();
pstm.close();
conn.close();
}
}
------------------------- insert/select Example ------------------------------------
import java.sql.*;
import java.sql.PreparedStatement;
import oracle.jdbc.driver.*;
//PreparedStatementを使用してSQLを実行する
class test {
public static void main (String args []) throws SQLException{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@aix:1521:nsdb", "scott", "tiger");
PreparedStatement pstm = conn.prepareStatement("insert into ktest values ('漢字')");
pstm.setEscapeProcessing(false);
ResultSet rset = pstm.executeQuery();
conn.commit();
System.out.println("insert OK");
PreparedStatement pstm2 = conn.prepareStatement("SELECT kanji, rawtohex(kanji) FROM ktest");
pstm2.setEscapeProcessing(false);
ResultSet rset2 = pstm2.executeQuery();
while(rset2.next())
System.out.println(rset2.getString(2));
rset.close();
pstm.close();
conn.close();
}
}
●実行例
set CLASSPATH=.;D:\oracle\product\10.2.0\jdbc\lib\ojdbc14_g.jar
C:\j2sdk1.4.2_08\bin\javac.exe H:\archive\bin\test.java
cd H:\archive\bin
> java test
nsdb ★接続出来た場合接続先DBのINSTANCE_NAMEが表示されます
■OCIドライバ TYPE2実行例
■JDBC OCI
LD_LIBRARY_PATH=$ORACLE_HOME/lib32; export LD_LIBRARY_PATH
javac -classpath .:$ORACLE_HOME/jdbc/lib/ojdbc14.jar oci.java
java -classpath .:$ORACLE_HOME/jdbc/lib/ojdbc14.jar oci
--tnsnames.ora
ORA9207 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = callisto)(PORT = 1521))
(CONNECT_DATA =
(SID = ORA9207)
)
)
--- oci.java
import java.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
public class oci {
public static void main (String args [])
throws SQLException, IOException {
// Oracle JDBC driverをロードします。
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection ("jdbc:oracle:oci:@ORA9207","scott", "tiger");
System.out.println ("connected.");
Statement pstm = conn.createStatement();
ResultSet rset = pstm.executeQuery("SELECT ename FROM emp");
while(rset.next())
System.out.println(rset.getString(1));
rset.close();
pstm.close();
conn.close();
}
}
---
Application Server専用ページへもどる