コラム: HPROFによるJavaプロファイリング



サンプルプログラム

■ヒーププロファイリング

HprofSample1.java

import java.util.Vector;

/**
 * ヒーププロファイリング用サンプル
 */
public class HprofSample1
{
    static public void main(String[] args)
    {
        HprofSample1 sample1 = new HprofSample1();
        sample1.execute();
    }
    
    /**
     * ObjectHolderを大量に生成・保持する
     */
    public void execute()
    {
        // ObjectHolder を 1024 個保持する
        Vector vector = new Vector();
        for(int i = 0; i < 1024; i++)
        {
            ObjectHolder obj = new ObjectHolder();
            vector.add(obj);
        }
    }
}

/**
 * String型配列、int型配列を保持するサンプルクラス
 */
class ObjectHolder
{
    String[]  strArray = new String[32];
    Integer[] intArray = new Integer[32];
    
    /**
     * String型配列、int型配列を保持する
     */
    public ObjectHolder()
    {
        for(int cnt = 0; cnt < 32; cnt++)
        {
            strArray[cnt] = new String("");
            intArray[cnt] = new Integer(0);
        }
    }
}
戻る

■CPUプロファイリング

HprofSample2.java

/**
 * CPUプロファイリング用サンプル
 */
public class HprofSample2
{
    static public void main(String[] args)
    {
        HprofSample2 sample2 = new HprofSample2();
        sample2.execute();
    }
    
    /**
     * 時間がかからない処理を大量に繰り返し実行し、
     * 時間がかかる処理を1回実行する。
     */
    public void execute()
    {
        // 時間がかからない処理を大量に繰り返し実行する
        for(int cnt = 0; cnt < 65535; cnt++)
        {
            this.shortMethod();
        }
        
        // 時間がかかる処理を1回実行する
        this.longMethod();
    }
    
    /**
     * 時間がかからない処理を実行する。
     */
    public void shortMethod()
    {
        double d = (double)1.0;
        
        for(int i = 0; i < 1024; i++)
        {
            d *= 2;
            d /= 2;
        }
    }

    /**
     * 時間がかかる処理を実行する。
     */
    public void longMethod()
    {
        double d = (double)1.0;
        
        for(int cnt = 1; cnt < 65535; cnt++)
        {
            for(int i = 0; i < 1024; i++)
            {
                d *= 2;
                d /= 2;
            }
        }
    }
}
戻る

■モニターオブジェクトの状態監視

HprofSample3.java

/**
 * モニターオブジェクトの状態監視用サンプル
 */
public class HprofSample3
{
    static public void main(String[] args)
    {
        // デッドロックを起こすため、SyncClassを生成する
        SyncClass obj1 = new SyncClass();
        SyncClass obj2 = new SyncClass();
        obj1.setOther(obj2);
        obj2.setOther(obj1);
        
        // SyncClass実行スレッドを起動する
        obj1.start();
        obj2.start();
        
        // SyncClass実行スレッドがデッドロックを起こすので
        // プログラムを強制終了する
        try
        {
            Thread.currentThread().sleep(2000);
            System.exit(0);
        }
        catch(Throwable t)
        {
            t.printStackTrace();
        }
    }
}

/**
 * デッドロックを起こすためのサンプルクラス。
 * 自分自身のsynchronizedブロックから
 * setOtherメソッドで指定されたインスタンスの
 * synchronizedメソッドを互いに呼び出すことで、
 * デッドロックを引き起こす。
 */
class SyncClass extends Thread
{
    SyncClass other;
    
    /**
     * ロックするオブジェクトを保持する
     * @param ロックするオブジェクト
     */
    public void setOther(SyncClass obj)
    {
        other = obj;
    }
    
    /**
     * ロックするオブジェクトを保持する
     */
    public void run()
    {
        synchronized(this)
        {
            System.out.println("lock my object.");
            try
            {
                Thread.currentThread().sleep(1000);
                other.lock();
            }
            catch(Throwable t)
            {
                t.printStackTrace();
            }
        }
    }
    
    /**
     * デッドロックを引き起こすためのsynchronizedメソッド
     */
    synchronized public void lock()
    {
        System.out.println("lock.");
    }
}
戻る

Page Top
アンケートフォーム

このページに掲載されていた情報は役にたちましたか?

  • とても役に立った
  • 役に立った
  • あまり役にたたなかった
  • 役にたたなかった

注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
エスエムジー株式会社は一切関知いたしません。

  • 現象別Index
  • 原因別Index

Find Bugsバグ詳細

Find Bugs Bug Descriptions日本語版

RSSで更新情報を取得する

RSSとは、ホームページの更新情報を配信する為のフォーマットです。
RSSを利用すると、登録したページの情報が更新された場合に、更新情報を自動的に受け取る事ができます。

詳細

弊社小森が執筆致しました

Javaでオブジェクト指向開発

Javaプログラミング言語習得において、新人プログラマーの最初の障害は「オブジェクト指向の壁」です。
本書は、Javaのソフトウェア開発を中心に事業を発展させてきたSMG社の新人教育セミナーを加筆・書籍化したもので、大卒の新人に対して、ゼロからJava言語を教えてきた実績をフィードバックしています。

メールマガジン配信中

Javaトラブルシューティングのメルマガをはじめました!是非ご購読ください

詳細