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専用ページへもどる