JAI利用時の注意事項

概要

x-Servlet提案時や導入前などによく聞かれる、一番基本的な注意事項がまとめてあります。
さらに詳細な内容を知りたい場合は関連するページを参照してください。

x-Servlet起動時のJAIファイル削除
メモリリークについて(1)
メモリリークについて(2)
64bit版 Windows にインストールする場合

x-Servlet起動時のJAIファイル削除[Version2.4.0以降]

x-Servletが画像変換に使用しているJAIのライブラリが、テンポラリディレクトリにjai-FCSS-XXXXX.tmpのようなtmpファイルを出力することがあります。
(XXXXXは任意の整数)

x-Servlet稼動中はJAIライブラリが適宜tmpファイルを削除するのですが、コンテンツ開発中等のためにx-Servletの再起動を何度も行った場合、jai-FCSS-XXXXX.tmpが残ってしまうことがあります。

ファイルが残ったままだとテンポラリディレクトリを圧迫してしまう可能性があるため、x-Servletは起動時にjai-FCSS-XXXXX.tmpを削除致します。
そのため、x-Servletが動作しているサーバ上で他のJAIライブラリを使用しているアプリケーションが存在する場合には、そのアプリケーションが使用しているJAIのtmpファイルを削除してしまう可能性があります。

その場合にはx-Servlet起動スクリプトのJVM_OPTIONに''-Djava.io.tmpdir=YYY''を追加することによりtmpファイルの作成先ディレクトリを指定することが可能です。(YYYは絶対PATHで記述されたディレクトリ名)

現在のテンポラリディレクトリを確認するにはxInfo.logの<java.io.tmpdir>=<YYY>のYYYをご確認下さい。

メモリリークについて(1)

JDK1.6系の環境で x-Servlet の画像変換機能を使用する(JAIを使用する)とヒープ領域を占有しつづける現象が発生します。

メモリリークが発生しているかどうかについてはJAVA の起動オプションで GCログを取得し、ガベージコレクションによってメモリの開放が行われ、一定のレベルまでメモリ消費が下がっていることを確認してください。
メモリリークがあると、GCで開放されるメモリ量が次第に少なくなり、最後には開放できるメモリがなくなります。

メモリリークは JAI が使用するテンポラリファイルへのパスサイズになりますので

 システムテンポラリへのパス+JAIテンポラリファイル名(30byteほど)

が「画像1ファイルへのアクセス時」に消費されるサイズとなります。
たとえばテンポラリディレクトリが「/tmp」ならば

 「/tmp/jai-FCSS-0123456789012345.tmp」

のような文字列が画像ファイルへのリクエストのたびにメモリ上に確保されます。

x-Servlet Version2.8.1以上では画像変換モジュールがこの問題に対応したものになっています。
インストールしたディレクトリのファイルが

 xproxy_image_223.jar

以上であれば対応済みバージョンとなります。

メモリリークについて(2)

JAI をインストールした際に Java ネイティブライブラリがインストールされますが、これらのライブラリを使用するとCヒープ領域のメモリリークが発生します。

このため OS上で Java が使用するメモリが増え続け、スワップファイルを使い切った時点で "Out of swap space" エラーを出して JVM が停止します。

これを回避するためにネイティブライブラリを使用せず、ピュアJava で画像変換を行うよう JVM のオプションを追加してください。

(Version2.8.1 以降は修正済み)

start.bat (Windows の場合)
@echo off
rem
rem set environment
rem
set JAVA_EXE=java
set JVM_OPTION=-Dcom.sun.media.jai.disableMediaLib=true -Xms256M -Xmx512M -server
set XPROXY_CLASSPATH=xproxy.jar;xproxy_image_223.jar
set XPROXY_CLASSPATH=%XPROXY_CLASSPATH%;jars/log4j-1.2.9.jar
set XPROXY_CLASSPATH=%XPROXY_CLASSPATH%;.

set XPROXY_EXE_CLASS=jp.co.flexfirm.xproxy.control.ServerMain

rem
rem execute
rem
@echo on

%JAVA_EXE% %JVM_OPTION% -classpath %XPROXY_CLASSPATH% %XPROXY_EXE_CLASS%
start.sh (Linux の場合)
#!/bin/sh #
# set environment
#
SET_ENV="env LANG=ja_JP.eucJP"
JAVA_EXE="java"
JVM_OPTION="-Dcom.sun.media.jai.disableMediaLib=true -Xms256M -Xmx512M -server"
XPROXY_CLASSPATH="xproxy.jar:xproxy_image_223.jar"
XPROXY_CLASSPATH="$XPROXY_CLASSPATH:jars/log4j-1.2.9.jar"
XPROXY_CLASSPATH="$XPROXY_CLASSPATH:."

XPROXY_EXE_CLASS="jp.co.flexfirm.xproxy.control.ServerMain"
#
# write PID
#
PID_FILE=./xproxy.pid

if [ -f $PID_FILE ]
then
    echo "It has already started."
    exit 1;
else
    #
    # execute
    #
    $SET_ENV $JAVA_EXE $JVM_OPTION -classpath $XPROXY_CLASSPATH $XPROXY_EXE_CLASS &

    echo $! > $PID_FILE

    wait `cat $PID_FILE`
    rm -f $PID_FILE
fi
#
# EOF
#

64bit版 Windows にインストールする場合

64bit版 Windows に JAI を導入する場合、32bit版 Windows とシステムディレクトリの構成の違いから正常にインストールできません。

「jai-1_1_2_01-lib-windows-i586-jdk.exe」または
「jai-1_1_2_01-lib-windows-i586-jre.exe」を実行した場合
JDK を見つけることができずインストールが失敗してしまう。

これは JAI のインストーラが 32bit版しかないため "C:\Program Files (x86)\" 以下のディレクトリを参照してしまい、"C:\Program Files\java\" を見つけられないために発生します。

このため 64bit版 Windows に JAI をインストールするには「jai-1_1_2_01-lib-windows-i586.exe」を用いて一時的にファイルを展開し、必要なファイルを手動でコピーする必要があります。

JAI のインストール手順

  1. jai-1_1_2_01-lib-windows-i586.exe をダブルクリック
  2. インストールウィザードが開いたら「Next」をクリック

  3. ライセンス許諾画面で「Yes」をクリック

  4. インストール先ディレクトリ画面でそのまま「Next」をクリック

  5. インストールが完了すると JAI 関連のファイルが "C:\jai-1.1.2_01\lib\" に展開されます。
x-Servlet 2.10.3以下の場合
  1. 展開されたファイルから以下のファイルを "C:\Program Files\java\JDK1.*.0_*\jre\lib\ext" にコピーします。
    • jai_codec.jar
    • jai_core.jar
    • mlibwrapper_jai.jar
x-Servlet 2.11.0以上の場合
  1. 展開されたファイルから以下のファイルを "${x-Servletのインストールディレクトリ}\jars" にコピーします。
    • jai_codec.jar
    • jai_core.jar

※JDK のバージョンアップなどで実行ディレクトリが変更された場合は上記手順の 6. を再度行う必要があります。

TOP