忍者ブログ

ビーキョウのIT

このブログは99%ののほほんと1%のお菓子でできています。

カテゴリー「Java」の記事一覧

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


Java監視ツール


こんちゃ(´・ω・)ノ


今回はJavaの監視ツールについて。
Javaでは標準でJavaの監視ツールが入ってたり入ってなかったりする。

sunからJDKを落としてきて入れている人は、
たぶん監視ツールが[JAVA_HOME]/bin/配下にあるだろう。


その中から監視に使えるツールを紹介します。
基本的にヒープ使用量などの監視ができます。


◆java VisualVM
グラフィカルなJavaのヒープ監視ができるツール。

コマンドプロンプトから「jvisualvm」を実行する。
すると以下のような画面が開きます。
jvisualVM1.pngjVisualVM.png






この画面でヒープ使用量などを監視することができます。


◆jconsole
jconsoleもグラフィカルにヒープ使用量を監視することができるツールです。
コマンドプロンプトから「jconsole」を実行します。
そして、監視したいプロセスを選択し、起動します。

すると、以下のような画面が表示されます。
jconsole.png









◆jps
JavaのプロセスIDを確認するコマンド。
コマンドプロンプトから「jps」を実行する。
C:\>jps
4424 Jps

◆jvmstat
1.jpsコマンドで、監視したいJVMのプロセスIDを確認。
  ※-vオプションで詳細表示
2.jstat <出力オプション> <プロセスID> <データ取得間隔(ms)>でjstat開始
  (例) jstat -gcutil -t 12829 3000(3秒)
3.まずは -gcutil でざっくり見てから、-gc で詳細を見ていくような感じか。
(例)
C:\>jstat -gcutil -t 2792 3000
Timestamp         S0     S1     E      O      P     YGC     YGCT    FGC    FGCT   GCT
    49.1   0.00  55.60   5.09  87.55  47.91     17    0.085     1    0.05 2    0.137
    52.2   0.00  55.60  66.49  87.55  47.97     17    0.085     1    0.05 2    0.137
    55.2   0.00  55.60 100.00  87.55  47.97     17    0.085     1    0.05 2    0.137

◆java gcログ
javaではJVMの起動オプションに、
gcログ出力のオプションを指定することができる。

gcとはガベージコレクションのことで、
javaシステムのパフォーマンスには
このGCが関係する。
ヒープサイズの設定によっては、
FullGCが起きると、Javaシステムのパフォーマンスが落ちるため、
GCログなどを出力して、
適切なヒープサイズのチューニングをしていく必要がある。


◆まとめ
今回はWindowsで行っているが、
JavaはOSを選ばないため、
環境があればLinuxで普通に動きます。

アプリケーションの作りで、
Javaシステムのパフォーマンスが悪くなったりしますが、
監視をすることで、
設定ミスなどによるボトルネックの検出ができるかもしれません。

単純にJavaアプリの作りが悪いのではなく、
javaの基本的なチューニングや監視も覚えておきましょう。
 

拍手[1回]

PR

Subversion(svn)のユーザ切り替え

こんちゃ(´・ω・)ノ


今回は、Javaとは少し違うのですが、

Eclipseで開発をしていると、
ソース管理サーバとしてcvsやsvnサーバを使用して、
チームでソース管理をすることがあると思います。


その中で、
Eclipseでsvnサーバにログインするときに、
ユーザとパスワードを入力するのですが、
その際にユーザ情報を保存してしまうと、
ユーザの切り替えが簡単にできません。


ほかのユーザでログインし直したいときなど、なかなか不便なところ。


そこで、ユーザ切り替えのための手順を記述します。


1.Eclipseを落とす。

2.C:\Documents and Settings\[Windowsユーザ]\Application Data\Subversion\auth\svn.simple
以下にあるファイルを消す。


3.Eclipse再起動

4.svnサーバにアクセスするとユーザ名とパスワードを聞かれる。
ここで、ログインしたいユーザでログインする。


とまぁ
こんな感じ。

結構簡単だが、
正直ネットなどで調べないと、
普通にはわからんところだよね。

あぁ、
あとApplication Dataは隠しディレクトリになってることが、
あるので注意。

拍手[4回]


プロパティ-読み込み-

こんちゃ(´・ω・)ノ

今回はプロパティファイルの読み込みです。

プロパティファイルとは以下のようなファイル。
--------------------------------------------
sample.properties
--------------------------------------------
text.file.name=sample.txt
text.file.path=C:\SAMPLE\
http.server.url=http://sample.co.jp
http.server.port=8080
dao.class.name=jp.co.sample.dao.SampleDAO

validation.check=true
--------------------------------------------

このプロパティファイルをjavaで読み込むことで、
処理を決定して様々な動作をさせることができる。

◆サンプル
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class Sample{
    private static final String PROPERTY_FILE = "sample.properties";
    private static final String TEXT_FILE_NAME = "text.file.name";
    private static final String TEXT_FILE_PATH = "text.file.path";
    private static final String HTTP_SERVER_URL = "http.server.url";
    private static final String HTTP_SERVER_PORT = "http.server.port";
    private static final String DAO_CLASS_NAME = "dao.class.name";
    private static final String VALIDATION_CHECK = "validation.check";

    public static void main(String[] args){
        Sample sample = new Sample();
        try{
            Properties properties = sample.loadProperties(PROPERTY_FILE);
            System.out.println(properties.getProperty
                                                       (TEXT_FILE_PATH+TEXT_FILE_NAME));
            System.out.println(properties.getProperty
                                  (HTTP_SERVER_URL+":"+HTTP_SERVER_PORT));
            System.out.println(properties.getProperty(DAO_CLASS_NAME));

            String validationCheck = properties.getProperty(VALIDATION_CHECK);
            if(validationCheck.equals("ture")){
                System.out.println("チェックする");
            }else{
                System.out.println("チェックしない");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
     }

    private Properties loadProperties(String propertyFile) 
                                                                         throws RuntimeException{
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream(new File(propertyFile)));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return properties;
    }
}

◆メリット
・プログラムはコンパイルしてclassファイルになると、中々修正が面倒だが、
 プロパティファイルは外部定義のため、容易に修正が可能になる。
・場合によってはプログラムを起動したままでも、処理を切り替えることができる。

◆デメリット
・設定情報が簡単に参照できる。
・動的に変化させることができるため、処理によっては制御が複雑になる。

◆まとめ
リフレクションと組み合わせることで、
動的にクラスやメソッドを決定することができ、
処理を動的に切り替えることができるのだ。
 

拍手[0回]


リフレクション

こんちゃ(´・ω・)ノ

今回はリフレクションについてです。

リフレクションとは、クラスの情報を取得して
クラスの生成やメソッドを利用したりするAPIです。

なかなかJavaの中でも難しいところだったりします。

◆例
public class Sample{
   public int getCount(){
      return 10;
   }
}

【サンプル】通常
Sample sample = new Sample();
int count = sample.getCount();

【サンプル】リフレクション
//インスタンス作成
Object instance = Sample.class.newInstance();
//メソッド取得
Method method = Sample.class.getMethod("getCount", new Class[0]);
//メソッド実行
Integer count = (Integer)method.invoke(instance, new Object[0]);

となります。
「え?なんか色々書いてるし通常のほうが簡単でいいんじゃないか?」
と思うかもしれませんが、
これの重要なところは"文字列でメソッドを取得"しているところです。
文字列指定のため、文字列を引数などで動的に変わるようにするだけで、
動的に実行したいメソッドを決定できるのです。
また「Sample.class」の部分は「Class.forName("Sample")」とも書き換えられるため、
クラスもメソッドも動的に決定できるわけです。


◆リフレクションを使って取得できる情報または処理
・クラス名とクラスのインスタンス
・メソッドとメソッドの実行
・フィールドの名前と値
・コンストラクタ
などなど。まだ色々あると思います。

◆メリッド
リフレクションを使用することにより、
動的に使用するクラスやメソッドを変えることができる。

◆デメリット
・クラスやメソッドが変わるため例外がcatchしずらい。
・実行されるまでどのクラスやメソッドを使用するのかわからないため、処理の流れがわかりにくい。
・インタプリタ実行のため処理速度が遅い。
→ループ文などで何度も呼ばなければ全然気にならない程度。

◆使用されている機能
一般的なプログラミングではあまり使用しませんが、
StrutsなどのWebアプリケーションのフレームワークなどで多く使用されています。 

拍手[0回]


共通化

こんちゃ(´・ω・)ノ

今回は共通化。
機能の共通化とも言えるかな。
プログラミングするとき、
同じような機能を何度も書いていませんか?

【例】共通化前
public class Sample{
   private static final String METHOD1 = "メソッド1";
   private static final String METHOD2 = "メソッド2";
   
   public static void main(String[] args){
      Sample sample = new Sample();
      sample.method1();
      sample.method2();
   }
  
  public void method1(){
      System.out.println(METHOD1);
   }
  public void method2(){
     System.out.println(METHOD2);
  }
}

【例】共通化後
public class Sample{
   private static final String METHOD1 = "メソッド1";
   private static final String METHOD2 = "メソッド2";
    
   public static void main(String[] args){
      Sample sample = new Sample();
      sample.methodPrint(METHOD1);
      sample.methodPrint(METHOD2);
   }
  
  public void methodPrint(String str){
      System.out.println(str);
   }
}

このように引数で表示するものを変えるようにした。

◆メリット
・修正箇所が減少する。
・問題が発生した場合に、参照する場所が少なくなる。
・コーディング量が減少する。

◆デメリット
・メソッド名に意味固有の意味を持たせることができない。
→定数名や変数名、メソッド名である程度意味はわかる。
・引数によって条件文などを使用するケースが多くなる。

◆まとめ
デメリットもあるにはあるが、そこまでのものではない。
それよりもメリットのほうが価値が高い。
システムの運用面や修正面などで共通化はかなり重要である。
よくDAOとかで同じようなメソッドを作成するが、
中に条件文を用いて共通化したほうがいいのか、
しないほうがいいのか検討が必要。

また、開発だとクラス設計書などもあって、
共通化しないと設計の修正部分も多くなる。

「一度書いたソースは二度書かない」
 

拍手[0回]


カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

最新コメント

[11/13 NEX-C3]
[01/24 R]
[07/30 ビーキョウ]
[07/25 unknown]
[06/24 ブログランキング]

最新トラックバック

バーコード

広告

カウンター

ブログ内検索

プロフィール


HN:ビーキョウ
職業:SI屋(PG、SE)
<自己紹介>
ちゃお(´・ω・)ノ
ビーキョウです。
どんどんスキルアップして、 その中で学んだことを忘れないようにメモ代わり的な 感じで記事を書いていこうという考えです。

なので、適当な部分が多々あるとは思いますが、 なにとぞよろしくお願いします
(´ ▽`)

バナーエリア

Copyright ©  -- ビーキョウのIT --  All Rights Reserved
Designed by CriCri / Photo by Geralt / Powered by [PR]
/ 忍者ブログ