ヘッダーをスキップ
Java Platform, Standard Edition Java Usage Trackerガイド
リリース1
E64861-04
 

 

Java Platform, Standard Edition

Java Usage Trackerガイド

リリース1

E64861-04(原本部品番号:E50948-06)

2020年4月

Java Usage TrackerはJava Runtime Environments (JRE)のシステムでの使用状況をトラッキングします。Java Usage Trackerの出力は、カンマで区切られたプレーン・テキストのレコードで、JREバージョン、実行中のアプリケーションおよびその他の詳細が含まれます。このレコードは、ファイルに追加されるか、User Datagram Protocol (UDP)パケットで、ネットワーク経由で送信されます。

Java Usage Trackerのシステム要件

Java Usage Trackerは、Oracle Java SEサブスクリプションおよびその他のレガシー製品(Oracle Java SE Advanced、Oracle Java SE Suiteなど)の一部として使用できます。

ノート:

パブリック・バージョンのJava SE 1.4.2, 5.0および6ではJava Usage Trackerはサポートされません。

Java Usage Trackerの出力

次は、Java Usage Trackerからの出力の例で、Javaアプリケーションの呼出し1件のレコードです。わかりやすくするために改行を追加しましたが、各レコードは次のように1つのテキスト行として表示されます。

"javaws application",
"Mon Feb 01 14:52:58 PST 2016",
"MY-COMPUTER/192.0.2.0",
"https://docs.oracle.com/javase/tutorialJWS/samples/deployment/
  dynamictree_webstartJWSProject/:
  sourceURL=https://docs.oracle.com/javase/tutorialJWS/samples/
    deployment/dynamictree_webstartJWSProject/dynamictree_webstart.jnlp
  app_model=eJytU9FqE0EUvWlSk9pQsSKCIgSpKCIzD4I++BQThZS1LU1FfSrTzbTZMDszztxt
    E4WCP1HwwT/wP3z3G3z1DwS9s7tpF5Q8dR9md/aeueeec+98+wXL3sGd2KTMZ5qN
    pFVmxpw8ZF1rX5uRVFA8tSW4GkErpl8HwkuEtWgijgXXEvmb3eh5BKsj6WOXWEyM
    RlgvwkroIz5El+gjgqzLKUrtCbArvclcLD3CzQKZYaJ41zkxixKPBG5PhDuHfYBT
    qBO/MrEIBGFfi2AlFYnuKeFzwBId8jLOXIKzUDvCo4iUcVLGC2WclPG5so1hBUuE
    y5igkmWiBs4sJbi3MMEeYejglWOpR8blJ6eW/GwHRYysYWTN2f1nT2///unq0BxA
    ayz8uEeHB9CwxiFJEBmOTShjznyYXFQxNh7L75Z1Bk1sVLmvUykl5Z/yQbg2MrFn
    xolYSUalI7zioRgvOWZINEJtvh1yL1KrpC9FpVIjH820SJMYnZT7J/LAo3BI0B1n
    JjJGHphWEJbHiNbbXOWNXGXoGzvv2/Tzj7tfvouvdaiRQp98lFMbxuekEdZp3qZ2
    GKf8R42yPFgwexubFyNwMYdL/85B81g6X25DC8K7OXelLP395RjRL8J7FO7L1DCa
    0pwgLKtkTKGxyc+efKqQ718O+f/CbKKVrZaA8Hge65nUGk2Juy4es0rp5LBKCgtP
    HTxc1IPqLSmbAOvUSwdr+QCEK85e6iytBi1Cc9jd6r/YfodwvSTuBOZOcI04O4s4
    w8WqpgvKbiGsdnd2okGvuzfY3kJon6eVIv0L97SYOQ==",
"C:\Java\jre1.8.0_71",
"1.8.0_71",
"25.71-b15",
"Oracle Corporation",
"Oracle Corporation",
"Windows 7",
"x86",
"6.1",
"-Xbootclasspath/a:C:\Java\jre1.8.0_71\lib\deploy.jar;
  C:\Java\jre1.8.0_71\lib\javaws.jar;C:\Java\jre1.8.0_71\lib\plugin.jar
  -Xverify:remote
  -Djava.security.manager
  -Djava.security.policy=
    file:C:\Java\jre1.8.0_71\lib\security\javaws.policy
  -DtrustProxy=true
  -Djnlpx.home=C:\Java\jre1.8.0_71\bin
  -Djnlpx.origFilenameArg=
    C:\Users\CURRENT-USER\AppData\Local\Temp\dynamictree_webstart.jnlp
  -Djnlpx.remove=true
  -Djnlpx.splashport=60247
  -Djnlpx.jvm=C:\Java\jre1.8.0_71\bin\javaw.exe ",
".",
"user.home=C:\Users\CURRENT-USER foo.bar=null"

次の表では、このカンマで区切られた行の各々の値について説明します。

説明

javaws application

起動のタイプ。次のいずれかの値です。

  • VM start : JVMスタートアップ(JavaアプリケーションまたはJNI呼出し)

  • plugin2: アプレット

  • javaws applicationまたはjavaws applet: Java Web Start

アプリケーションによるアプリの実行またはブロックを許可するデプロイメント・ルール・セット(DRS)がある場合は、起動の種類を示す値の後に、次のいずれかの値を指定します。

  • permitted

  • denied

  • denied [required version ruleVersion not available]: ruleVersionは、デプロイメント・ルール・セット仕様の必要な最小バージョン

DRSの実行ルールまたはブロック・ルールがない場合は、起動の種類を示す値の後に、次のいずれかの値を指定します。

  • denied [by user]

  • denied [by security settings]

  • 値なし(空の文字列): アプリケーションの実行が許可されます

Mon Feb 01 14:52:58 PST 2016

日付と時刻

MY-COMPUTER/192.0.2.0

<hostname>/<literalIPaddress>という形式のホスト名とIPアドレス

https://docs.oracle.com/javase/tutorialJWS/
  samples/deployment/
  dynamictree_webstartJWSProject/:
  sourceURL=https://docs.oracle.com/
    javase/tutorialJWS/samples/deployment/
    dynamictree_webstartJWSProject/
    dynamictree_webstart.jnlp
  app_model=<Base64 encoded data>

Javaコマンド(mainクラスまたはjarファイルの名前)と、存在する場合は引数のリスト(スペース区切りのリスト)

Java Web Startアプリケーションは、次の形式を持ちます。

<Document base>:
  <main class> <arguments>
  app_model=<serialized classes for use by AMC>
  app_customer=<contents of the <customer> block in a rule>

アプレット呼出しは、次の形式を持ちます。

<Document base>:
  <parameters>
  app_model=<serialized classes for use by AMC>
  app_customer=<contents of the <customer> block>  

app_modelapp_customerの値はBase64でエンコーディングされます。

app_modelの値には、場所、コードベース、メイン・クラスなど、アプリケーションの基本情報が含まれます。アプリケーションの実行の許可または拒否にかかわらず、値は同じです。

パラメータapp_customerが表示されるのは、<customer>ブロックを含む特定のDRSルールによってアプリケーションが管理される場合のみです。

C:\Java\jre1.8.0_71

JREを含んでいるディレクトリ(java.homeシステム・プロパティ値)

1.8.0_71

Javaバージョン(java.versionシステム・プロパティ値)

25.71-b15

JVMバージョン(java.vm.versionシステム・プロパティ値)

Oracle Corporation

Javaベンダー(java.vendorシステム・プロパティ値)

Oracle Corporation

JVMベンダー(java.vm.vendorシステム・プロパティ値)

Windows 7

オペレーティング・システム名(os.nameシステム・プロパティ値)

x86

オペレーティング・システム・アーキテクチャ(os.archシステム・プロパティ値)

6.1

オペレーティング・システム・バージョン(os.versionシステム・プロパティ値)

-Xbootclasspath/a:C:\Java\jre1.8.0_71\lib\
  deploy.jar;C:\Java\jre1.8.0_71\lib\javaws.jar;
  C:\Java\jre1.8.0_71\lib\plugin.jar
  -Xverify:remote
  -Djava.security.manager
  -Djava.security.policy=file:C:\Java\jre1.8.0_71\
    lib\security\javaws.policy
  -DtrustProxy=true
  -Djnlpx.home=C:\Java\jre1.8.0_71\bin
  -Djnlpx.origFilenameArg=C:\Users\CURRENT-USER\
    AppData\Local\Temp\dynamictree_webstart.jnlp
  -Djnlpx.remove=true
  -Djnlpx.splashport=60247
  -Djnlpx.jvm=C:\Java\jre1.8.0_71\bin\javaw.exe

JVM引数(スペース区切りリスト)。JVM引数がない場合は空になります。この情報が利用できない場合はn/aです(たとえば、Java SE 1.4.2では、この情報は利用できません)。

.

クラス・パス(java.class.pathシステム・プロパティ値)

user.home=C:\Users\CURRENT-USER foo.bar=null

Java Usage Trackerプロパティ・ファイルで指定されているすべての追加システム・プロパティのName=valueペア。複数のペアはスペースで区切られます。追加のプロパティ名が指定されない場合は空です(デフォルト)。

Java Usage Tracker出力内のスペースを含む項目

スペース区切りリストのフィールドでは、スペースを含む項目を引用する場合に異なる引用符が使用されます(デフォルトでは一重引用符「'」)。既存の引用符は二回出力されます。

次に、コマンドの例を示します。

/jdk1.8.0_20/bin/java
  -Dfoo1="a b"
  -Dfoo=\"
  -jar c:\\Program\ Files\\Java/jdk1.6.0_25/demo/jfc/Java2D/Java2Demo.jar

Java Usage Trackerは、これらのシステム・プロパティを次のように出力します(わかりやすくするために改行を追加しました)。

"'-Dfoo1=a b' -Dfoo="" ",
"-jar c:\Program Files\Java/jdk1.6.0_25/demo/jfc/Java2D/Java2Demo.jar",
""

8u20より前のバージョンのJREでは、Java Usage Trackerは、フィールドを引用符で囲みません。

Java Usage Trackerの有効化と構成

Java Usage Trackerは、デフォルトで無効です。有効化して構成するには、usagetracker.propertiesという名前のプロパティ・ファイルを作成します。「サンプルのJava Usage Trackerプロパティ・ファイル」を参照してください。

JRE 8u152以降の場合、Java Usage Trackerを使用してシステム上のすべてのJREを追跡するには、usagetracker.propertiesファイルをファイル・システム内の中央の場所に配置します。次に示すように場所はオペレーティング・システムによって異なります。

  • Windows: %ProgramFiles%\Java\conf\

  • LinuxおよびSolaris: /etc/oracle/java/

  • macOS: /Library/Application Support/Oracle/Java/

Java Usage Trackerを使用して特定のJREを追跡する場合は、usagetracker.propertiesファイルをファイル・システム内の中央の場所に置かないでください。usagetracker.propertiesファイルはディレクトリ<JRE directory>/conf/management/ (9よりも前のJREリリースでは<JRE directory>/lib/management/)に配置します。Java Usage TrackerをJDK用とJRE用のどちらで構成するかにより、パス名が異なる点に注意してください。

異なるプロパティ・ファイルを使用する場合、コマンド行でそれをシステム・プロパティ-Dcom.oracle.usagetracker.config.fileに指定して、柔軟性をさらに高めることができます。次の例では、Java Usage Trackerはプロパティ・ファイル/path/usagetracker.propertiesを使用します。

java -Dcom.oracle.usagetracker.config.file=/path/usagetracker.properties MyApplication

JVMは、次の場所で順番にusagetracker.propertiesファイルを検索します。見つかった最初のファイルを使用し、Java Usage Trackerを有効化して構成します。

  1. システム・プロパティ-Dcom.oracle.usagetracker.config.fileによって指定されたパス

  2. ファイル・システム内の中央の場所(JRE 8u152以降)

  3. <JRE directory>/conf/management/ (9よりも前のJREリリースでは<JRE directory>/lib/management/)

ノート:

Java Usage Trackerを有効化するには、作成するusagetracker.propertiesファイルが、少なくとも次のいずれかのプロパティの有効な値を含む必要があります。
  • com.oracle.usagetracker.logToFile

  • com.oracle.usagetracker.logToUDP

Java Usage Trackerのプロパティ

この項では、Java Usage Trackerプロパティ・ファイルで指定できるプロパティを説明します。

これらのプロパティは、Java Usage Trackerプロパティ・ファイルでのみ設定されます。コマンド行で設定されません。これは、Java Usage TrackerがJREユーザーまたは既存のアプリケーションに影響を与えたり相互作用したりしないためです。

ノート:

バックスラッシュ(\)が、プロパティ・ファイルのエスケープ文字です。従って、ディレクトリまたはドライブ文字を含むファイル・パスを指定する場合、ディレクトリの区切り記号として、スラッシュ(/)またはエスケープしたバックスラッシュ(\\)を使用します。

プロパティ 説明

com.oracle.usagetracker.additionalProperties

このプロパティは、追加のJavaプロパティと、その値を記録するために使用します。

このプロパティの値は、プロパティと値のカンマ区切りリストです。 例(改行は無視してください):

com.oracle.usagetracker.additionalProperties =
com.company.interestingProperty,com.anotherInterestingProperty

com.oracle.usagetracker.innerQuote

JVM引数フィールドと追加のプロパティ・フィールドにスペースが含まれる項目を引用するために使用される文字または文字列。デフォルト値は、一重引用符(')です。

このプロパティは、JRE 8u20以降で使用できます。

com.oracle.usagetracker.logFileMaxSize

ログ・ファイル・サイズの上限(単位はバイト)。ロギング試行時にファイル・サイズが所定の値以上の場合、その試行はキャンセルされます。

このプロパティが設定されない場合、ログ・ファイルに上限はありません。

com.oracle.usagetracker.logToFile

このプロパティが指定された場合、Usage Trackerがレコードを書き込むファイルの完全修飾パス名。

パス名では、${user.home}を指定できます。プロパティは、ユーザーのホーム・ディレクトリまで展開されます。 例(改行は無視してください):

com.oracle.usagetracker.logToFile = ${user.home}/.java_usagetracker

com.oracle.usagetracker.logToUDP

このプロパティが指定された場合、Java Usage TrackerはUDPパケットで指定されたリモート・ホストにログインします。 例(改行は無視してください):

com.oracle.usagetracker.logToUDP =
loggingmachine.domainname:32139

IPアドレスを指定すると高速になることがあります。ただし、この解決方法によりJVMまたはアプリケーションの起動が遅延することはありません。

UDPパケットを受信できるサンプル・アプリケーションの詳細は、「Java Usage Trackerのサンプル: UDPパケットの受信側」を参照してください。

com.oracle.usagetracker.maxFieldSize

すべての単一フィールドの制限(バイト単位)。デフォルトは制限なしです。com.oracle.usagetracker.sendTruncatedRecordsプロパティがtrueの場合、Java Usage Trackerによって、フィールドがこの制限まで切り捨てられますが、レコード形式は維持されます。

このプロパティは、JRE 8u152以降で使用できます。

com.oracle.usagetracker.maxSize

レコード全体の制限(バイト単位)。デフォルトは制限なしです。com.oracle.usagetracker.sendTruncatedRecordsプロパティがtrueの場合、Java Usage Trackerによって、レコードがこの制限まで切り捨てられます。

このプロパティは、JRE 8u152以降で使用できます。

com.oracle.usagetracker.quote

フィールドを引用するために使用される文字または文字列。デフォルト値は、二重引用符(")です。

このプロパティは、JRE 8u20以降で使用できます。

com.oracle.usagetracker.sendTruncatedRecords

com.oracle.usagetracker.maxSizeプロパティとcom.oracle.usagetracker.maxFieldSizeプロパティそれぞれで指定されるサイズを超えたときに、レコードと各フィールドを切り捨てます。デフォルト値はtrueです。

このプロパティは、JRE 8u152以降で使用できます。

com.oracle.usagetracker.separator

ログ・ファイルのエントリを区切る文字または文字列。デフォルトはカンマ(,)です。

com.oracle.usagetracker.verbose

このプロパティをtrueに設定すると、エラー情報を標準エラー・ストリームに報告することができます。これは診断の目的でのみ推奨されます。

サンプルのJava Usage Trackerプロパティ・ファイル

Java Usage Trackerプロパティ・ファイルを作成するには、次の例をテンプレートに使用できます。シャープ記号(#)から始まる行はコメントです。

# UsageTracker template properties file.
# Copy to <JRE directory>/conf/management/usagetracker.properties
# (or <JRE directory>/lib/management/usagetracker.properties for
# JRE releases prior to 9) and edit, uncommenting required settings, to enable.
 
# Settings for logging to a file:
# Use forward slashes (/) because backslash is an escape character in a
# properties file.
# com.oracle.usagetracker.logToFile = ${user.home}/.java_usagetracker

# Settings for logging to a UDP socket:
# com.oracle.usagetracker.logToUDP = hostname.domain:32139
  
# (Optional) Specify a file size limit in bytes:
# com.oracle.usagetracker.logFileMaxSize = 10000000
 
# If the record should include additional Java properties,
# this can be a comma-separated list:
# com.oracle.usagetracker.additionalProperties = 
 
# Additional options:
# com.oracle.usagetracker.verbose = true
com.oracle.usagetracker.separator = ,
com.oracle.usagetracker.quote = "
com.oracle.usagetracker.innerquote = '

Java Usage Trackerのサンプル: UDPパケットの受信側

次のサンプルUsageServerTracker.javaは、Java Usage Trackerデータをリスニングする単純なアプリケーションです。

/*
 * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 *
 * -Redistribution in binary form must reproduce the above copyright notice,
 *  this list of conditions and the following disclaimer in the documentation
 *  and/or other materials provided with the distribution.
 *
 * Neither the name of Oracle or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that this software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */
 
import java.net.InetAddress;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.io.IOException;
import java.net.SocketException;
 
import java.io.File;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
 
/**
  * A daemon that listens for and logs UsageTracker information.
  */
public class UsageTrackerServer {
 
    static boolean verbose = false;
    boolean initialized = false;
    String logFileName = null;
    File logFile;
    OutputStreamWriter writer;
    int port = 32139;
    InetAddress address = null;
    DatagramSocket socket;
    private static final int BUFFERSIZE = 65536;
    long received = 0;
    boolean running = true;
 
    /**
      * Main entry point for starting this daemon.
      */
    public static void main(String [] args) {
        try {
            UsageTrackerServer uts = new UsageTrackerServer(args);
            uts.run();
        } catch (Exception e) {
            System.out.println("UsageTrackerServer: " + e.getMessage());
            if (verbose) {
                e.printStackTrace();
            }
            System.exit(1);
        }
    }
 
    public static void usage() {
        System.out.println("UsageTrackerServer [-v] [-o filename] [host]:port\n" +
            "e.g. UsageTrackerServer -o usagetracker.out :32139\n");
    }
 
    /**
      * Initialize a UsageTrackerServer given some arguments.
      */
    UsageTrackerServer(String [] args) throws Exception {
 
        boolean usage = false;
        for (int i=0; i<args.length; i++) {
 
            if (args[i].equals("-?") || args[i].equals("--h")) {
                usage = true;
                break;
            } else if (args[i].equals("-v")) {
               verbose = true;
            } else if (args[i].equals("-o")) {
                logFileName = args[i+1];
                i++;
            } else if (args[i].contains(":")) {
                // parse [address]:port
                int colon = args[i].indexOf(':');
                if (colon > 0) {
                    try {
                        address = InetAddress.getByName(
                            args[i].substring(0, colon));
                    } catch (Exception ae) {
                        System.out.println("UsageTrackerServer: " +
                            "problem setting listen address: " + ae);
                        usage = true;
                    }
                }
                try {
                    port = Integer.parseInt(args[i].substring(colon+1));
                } catch (NumberFormatException nfe) {
                    System.out.println("UsageTrackerServer: cannot set port: " +
                        args[i].substring(colon+1));
                    usage = true;
                }
            } else {
                usage = true;
            }
        }
        // Argument failure or request for usage gets the usage message only:
        if (usage) {
            usage();
            return;
        }
        // Otherwise, continue to proper initialization:
        socket = null;
        try {
        if (address != null) {
            socket = new DatagramSocket(port, address);
        } else {
            socket = new DatagramSocket(port);
        }
        } catch (SocketException se) {
            throw new Exception("problem creating socket: " + se);
        }
        if (logFileName != null) {
            try {
                File logFile = new File(logFileName);
                if (verbose) {
                    System.out.println("Using logfile: " + logFileName);
                    if (logFile.exists()) {
                        System.out.println("File exists, will append.");
                    }
                }
                FileOutputStream fos = new FileOutputStream(logFile, true);
                writer = new OutputStreamWriter(fos, "UTF-8");
            } catch (IOException ioe) {
                throw new Exception("problem using file " + logFileName + ": " +
                    ioe);
            }
        }
        initialized = true;
    }
 
   public void run() throws Exception {
        if (!initialized) {
            return;
        }
        Runnable r = null;
        if (writer == null) {
            r = new UsageTrackerServerRunnable(socket);
        } else {
            r = new UsageTrackerServerRunnable(socket, writer);
        }
        Thread t = new Thread(r, "UsageTrackerServerRunnable");
        t.start();
        t.join();
    }
 
    /**
      * Runnable that listens and logs.
      */
    private class UsageTrackerServerRunnable implements Runnable {
        DatagramSocket listenSocket;
        OutputStreamWriter writer = null;
 
        UsageTrackerServerRunnable(DatagramSocket socket) {
            listenSocket = socket;
        }
        UsageTrackerServerRunnable(DatagramSocket socket,
            OutputStreamWriter writer) {
            this(socket);
            this.writer = writer;
        }
 
        public void run() {
            byte [] buf = new byte[BUFFERSIZE];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
 
            // Ready to receive data
            if (verbose) {
                String addr = listenSocket.getLocalAddress().getHostAddress();
                if (addr.equals("0.0.0.0")) {
                    addr = "localhost";
                }
                System.out.println("UsageTrackerServer: ready to receive on " +
                    addr + ":" + listenSocket.getLocalPort());
            }
            while (running) {
                try {
                    listenSocket.receive(packet);
                    String dataReceived = new String(packet.getData(), 0,
                        packet.getLength());
 
                    // The format of a UsageTracker record contains a newline at
                    // the end; if that is missing, we have a truncated/corrupt
                    // packet.
                    if (!dataReceived.endsWith("\n")) {
                        System.out.println("Incomplete message received: " +
                          "size = " + packet.getLength() + ", data =  " +
                          dataReceived);
                        dataReceived = dataReceived + "\n";
                    }
                    received++;
                    if (verbose) {
                        System.out.println("Received message size: " +
                            dataReceived.length());
                    }
                    if (writer != null) {
                        writer.write(dataReceived, 0, dataReceived.length());
                        writer.flush();
                    } else {
                        System.out.print(dataReceived);
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
    }
}

次に示すのはこのサンプルの実行例です。

java UsageTrackerServer -v -o usagetracker.out :32139
  • -vオプションはverboseです。このオプションを指定すると、サンプルは追加情報を表示します。

  • -oオプションは、ログ・ファイルの名前を指定できるようにします;このオプションを指定しない場合、サンプルは標準出力にメッセージを出力します。

  • この例では、UDP受信者は、ポート32139上のローカルホスト・アドレスでリスニングします。JRE (Java Usage Trackerが有効化され構成されている)がデータを送信すると、受信側はデータをファイルusagetracker.outに送信します。ポート番号は任意ですが、使用することができ、JREで構成されているポートと一致する必要があります。複数のインタフェースが存在する場合、形式hostname:portまたはipaddress:portを使用してポートを指定する必要がある場合があります。

Java Usage Trackerのエラーと例外

レコードのロギング時にJava Usage Trackerがエラーまたは例外に遭遇しても、現在動作しているアプリケーションを中断しません。

プロパティ・ファイルでプロパティoracle.usagetracker.verboseが指定されていないかぎり、Java Usage Trackerはエラーを報告しません。

Java Usage Trackerログ・ファイルで使用されるディスク領域の管理

Java Usage Trackerログ・ファイルのサイズは小さいものですが、ログ・ファイルを定期的に切捨て、圧縮、アーカイブ、または削除することをお薦めします。Java Usage Trackerがログ・ファイルにレコードを逐次追加する場合、利用可能なディスク・スペース領域について確認したり、ログ・ファイルの切捨て、削除、圧縮などの管理タスクを実行して影響を最小限にしようとしたりすることはありません。

さらに、プロパティ・ファイルのoracle.usagetracker.logFileMaxSizeプロパティで、ログ・ファイルの最大サイズをバイト単位で指定できます。

Java Usage Trackerの制限事項

Java Usage Trackerは、JVMが起動する前にJavaランチャによって処理されるJavaコマンド行オプションを記録できません。たとえば、Java Usage Trackerは、Java HotSpotクライアントとサーバーVMをそれぞれ選択するコマンド行オプション-client-serverを記録しません。また、アプリケーションが即座に終了する場合、プロセスが終了するのを停止しないため、Java Usage Trackerが記録しない場合があります。

Java Usage Trackerのよくある質問

いくいつかのよくある質問に対する回答は、次の場所にあります。

Java Usage TrackerはJDKの範囲内で非公開のJREに影響を及ぼしますか。それとも影響を及ぼすのはスタンドアロンのJREだけですか。

コンピュータにJDKがインストールされている場合、1つのJREがjreサブディレクトリにあります。これが質問で指している非公開のJREです。Java Usage Trackerは、非公開のJREとスタンドアロンのJREの両方の使用状況を記録しますが、それぞれ独自のconf/management/usagetracker.propertiesファイルを介して別々に構成されることに注意してください。

Java Usage Trackerは、JDKツールの使用状況を記録できますか。

Java Usage Trackerが有効の場合、jmapやjstackなど、JDKに付属するツールの使用状況が記録されます。

Java Usage Trackerは、ネイティブのJavaアプリケーションによって作成されたJVMの使用状況を記録しますか。

はい。ネイティブのアプリケーションがJava Native Interface (JNI)を使用してJVMを作成する場合、Java Usage Trackerはこの呼出しを空白のJavaコマンドとともに記録します。

java -jar file.jarに類似した呼出しは、Java Usage Trackerによって追跡されますか。

はい。

Oracleは、Java Usage Trackerによって記録されるデータを少しでも捕捉しますか。

いいえ。JREインストールの管理者として、Java Usage Trackerから取得された使用状況データは、選択したファイルに格納されるか、指定したUDPホストおよびポートに送信されます。このデータを独自ネットワークから離れさせるファシリティはありません。(理論的には、ファイアウォールで可能な場合、UDPホストがリスニングするポートはリモートとして構成できますが、それは期待または推奨される使用法ではありません。)

ネイティブ・アプリケーション、アプレット、および拒否されたアプリケーションに関して、ログ・レコードはどのように表示されますか。

次に示すのは、ネイティブ・アプリケーションのログ・レコードの例です(わかりやすくするために改行を追加しました)。

"VM start",
"Mon Feb 01 14:29:35 PST 2016",
"MY-COMPUTER/192.0.2.0",
"com.sun.deploy.panel.ControlPanel",
"C:\Java\jre1.8.0_71",
"1.8.0_71",
"25.71-b15",
"Oracle Corporation",
"Oracle Corporation",
"Windows 7",
"amd64",
"6.1",
"-Xbootclasspath/a:C:\Java\jre1.8.0_71\bin\..\lib\deploy.jar
  -Djava.locale.providers=HOST,JRE,SPI
  -Duser.home=C:\Users\CURRENT-USER",
".",
""

次に示すのは、アプレットのログ・レコードの例です。

"plugin2",
"Mon Feb 01 14:51:02 PST 2016",
"MY-COMPUTER/192.0.2.0",
"https://docs.oracle.com/javase/tutorial/deployment/applet/deployingApplet.html:
  jnlp_href=examples/dist/applet_ComponentArch_DynamicTreeDemo/dynamictree_applet.jnlp
  codebase_lookup=false
  code=appletComponentArch.DynamicTreeApplet.class
  codebase=https://docs.oracle.com/javase/tutorial/deployment/applet/
  width=450
  archive=examples/dist/applet_ComponentArch_DynamicTreeDemo/DynamicTreeDemo.jar
  height=450
  app_model=eJy1U71uE0EQHv8kdogVhFEaEJKFEoEodjsoqA47RdABUWwQXbScN/FGd7vL7pw5
    U0TiJZAoeAPeg55noOUNkGD2fP4BJHdccbc/38w33zdzX37AlndwOzEZ87lmY2lT
    M2NOnrPI2mdmLFOYP7U6XIuhndDRG+Elwl58KaaCa4n85Wn8OIbdsfSJUxaV0Qjd
    +XUq9AUfolP6giBdWaDUngCn0pvcJdIj7M+ROaqUR86JWaw8ErhzKdwS9hauoEH8
    qUlEIAj7Wgw7mVC6nwpfAuoU5GWSO4WzUDvCg5iUcVLG58o4KeMLZQfDNSwRbqHC
    VFaJmjizlODuxgQjwlDg9lTqsXFlZGHJz05QxMgaRtZ8PHz08NbP764BrWNoT4Sf
    9Cn4GJrWOCQJIseJCWUsmM/VqoqJ8Vit29YZNIlJq32DSqkof1UPwvWxSTwzTiSp
    ZFQ6wiseivGSY45EI9JKSSY1cmFtSg2Uhcho4fmYrK8Oz/oms0YTKnLJ5Gww0yJT
    ychJOZCZ4YF5B6lARGtL0TdL0aGNbNnG4sO3O5++is8NqJFgr97LwoZpetcM76Ls
    WidMV3lQoyz3NoziwdPVRKzGsv7vWLSm0vlqGzoSvq2FSVXl6v/48tee0RCXhOG1
    S0YVFuFwnumPRGwtMCqvrxzc32TG+vRWbkCXTHWwV3Yi/HrsSOfZ+iWxt4bR88GT
    F68RblScvUDaC+USZ28TZxj49XRB1T7CdnRyEh+NEDrLjFJkvwEAyW8t",
"C:\Java\jre1.8.0_71",
"1.8.0_71",
"25.71-b15",
"Oracle Corporation",
"Oracle Corporation",
"Windows 7",
"x86",
"6.1",
"-Xbootclasspath/a:C:\Java\jre1.8.0_71\lib\deploy.jar;
  C:\Java\jre1.8.0_71\lib\javaws.jar;C:\Java\jre1.8.0_71\lib\plugin.jar
  -Djava.security.manager
  -D__jvm_launched=29258397636
  -D__applet_launched=29258393819 ",
"C:\Java\jre1.8.0_71\classes",
""

次に示すのは、セキュリティ設定によって拒否されたJava Web Startアプリケーションのログ・レコードの例です。

"javaws application denied [by security settings]",
"Tue Nov 03 19:43:57 MSK 2015",
"example.com/192.0.2.0",
"https://docs.oracle.com/javase/tutorial/deployment/webstart/deploying.html:
  sourceURL=https://docs.oracle.com/javase/tutorialJWS/samples/deployment/
    dynamictree_webstartJWSProject/dynamictree_webstart.jnlp
  app_model=eJytU9FqE0EUvWlSk9pQsSKCIgSpKCIzD4I++BQThZS1LU1FfSrTzbTZMDszztxt
    E4WCP1HwwT/wP3z3G3z1DwS9s7tpF5Q8dR9md/aeueeec+98+wXL3sGd2KTMZ5qN
    pFVmxpw8ZF1rX5uRVFA8tSW4GkErpl8HwkuEtWgijgXXEvmb3eh5BKsj6WOXWEyM
    RlgvwkroIz5El+gjgqzLKUrtCbArvclcLD3CzQKZYaJ41zkxixKPBG5PhDuHfYBT
    qBO/MrEIBGFfi2AlFYnuKeFzwBId8jLOXIKzUDvCo4iUcVLGC2WclPG5so1hBUuE
    y5igkmWiBs4sJbi3MMEeYejglWOpR8blJ6eW/GwHRYysYWTN2f1nT2///unq0BxA
    ayz8uEeHB9CwxiFJEBmOTShjznyYXFQxNh7L75Z1Bk1sVLmvUykl5Z/yQbg2MrFn
    xolYSUalI7zioRgvOWZINEJtvh1yL1KrpC9FpVIjH820SJMYnZT7J/LAo3BI0B1n
    JjJGHphWEJbHiNbbXOWNXGXoGzvv2/Tzj7tfvouvdaiRQp98lFMbxuekEdZp3qZ2
    GKf8R42yPFgwexubFyNwMYdL/85B81g6X25DC8K7OXelLP395RjRL8J7FO7L1DCa
    0pwgLKtkTKGxyc+efKqQ718O+f/CbKKVrZaA8Hge65nUGk2Juy4es0rp5LBKCgtP
    HTxc1IPqLSmbAOvUSwdr+QCEK85e6iytBi1Cc9jd6r/YfodwvSTuBOZOcI04O4s4
    w8WqpgvKbiGsdnd2okGvuzfY3kJon6eVIv0L97SYOQ==",
"/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home",
"1.8.0_65",
"25.65-b01",
"Oracle Corporation",
"Oracle Corporation",
"Mac OS X",
"x86_64",
"10.10.5",
"'-Djava.security.policy=file:/Library/Internet Plug-Ins/
  JavaAppletPlugin.plugin/Contents/Home/lib/security/javaws.policy'
  -DtrustProxy=true
  -Xverify:remote '-Djnlpx.home=/Library/Internet Plug-Ins/
    JavaAppletPlugin.plugin/Contents/Home/bin'
  -Djava.security.manager
  -Djnlpx.origFilenameArg=/Users/CURRENT-USER/Library/Caches/Java/
    dynamictree_webstart.jnlp
  -Djnlpx.remove=false
  -Dsun.awt.warmup=true '-Xbootclasspath/a:/Library/Internet Plug-Ins/
    JavaAppletPlugin.plugin/Contents/Home/lib/javaws.jar:/Library/
    Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/
    deploy.jar:/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/
    Contents/Home/lib/plugin.jar' '-Dmacosx.jnlpx.dock.name=Java Web
    Start' '-Dmacosx.jnlpx.dock.icon=/Library/Internet Plug-Ins/
    JavaAppletPlugin.plugin/Contents/Home/lib/deploy/
    webStartAppIcon.icns' '-Djnlpx.jvm=""/Library/Internet Plug-Ins/
      JavaAppletPlugin.plugin/Contents/Home/bin/java""' ",
"/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/
  lib/deploy.jar",
""

以前の形式のレコードに対する、JRE 8u20以降の引用動作を無効にする方法。

Java Usage Trackerプロパティ・ファイルで、次の2行を使用して空白の引用符を設定します。

com.oracle.usagetracker.quote=
com.oracle.usagetracker.innerQuote=

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

サポートを購入したオラクル社のお客様は、My Oracle Supportを介して電子的なサポートにアクセスできます。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。


Java Platform, Standard Edition Java Usage Tracker Guide, リリース1

E64861-04

Copyright © 2014, 2020, Oracle and/or its affiliates.

Java Usage Trackerの構成、有効化、トラブルシューティングの方法、出力の解釈方法、およびデータをリスニングするアプリケーションの作成方法について説明します。

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

米国政府機関エンド・ユーザー: オラクル社のプログラム(オペレーティング・システム、統合ソフトウェア、提供されたハードウェアに対して組み込まれたか、インストールされたか、アクティブ化されたプログラム、およびそのようなプログラムの変更版など)、およびオラクル社によるコンピュータ・ドキュメント、または米国政府機関エンド・ユーザーに提供されたかそれらがアクセスしたその他のOracleデータは、適用可能な連邦政府調達規則および政府機関固有の補足規則に準拠した「商用コンピュータ・ソフトウェア」または「商用コンピュータ・ソフトウェア・ドキュメント」です。そのようなものとして、i)オラクル社のプログラム(オペレーティング・システム、統合ソフトウェア、提供されたハードウェアに対して組み込まれたか、インストールされたか、アクティブ化されたプログラム、およびそのようなプログラムの変更版など)、ii)オラクル社によるコンピュータ・ドキュメントまたはiii)その他のOracleデータ(またはそれらすべて)の使用、模造、複製、リリース、表示、開示、変更、派生物の準備、または改作(またはそれらすべて)は、適用可能な契約に含まれているライセンスで指定された、権利および制限の対象となります。Oracleクラウド・サービスを米国政府機関がどのように使用するかに影響する条件は、当該サービスについての適用可能な契約によって定められます。No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Insideは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Epyc、AMDロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。お客様との間に適切な契約が定められている場合を除いて、オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。お客様との間に適切な契約が定められている場合を除いて、オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。