Java.lang.Runtime類を分析する

7305 ワード

一、概要      Runtime類は運転時の環境をカプセル化しています。各Javaアプリケーションは、Runtimeクラスのインスタンスを持っており、アプリケーションを実行環境に接続することができます。      一般的にはRuntimeオブジェクトを実装することはできません。アプリケーションも独自のRuntimeクラスのインスタンスを作成することはできませんが、getRuntimeメソッドを通じて現在のRuntime実行時のオブジェクトの参照を取得することができます。      現在のRuntimeオブジェクトの参照が得られると、Runtimeオブジェクトの方法を呼び出してJava仮想マシンの状態と挙動を制御することができる。       Appleや他の信頼されていないコードがRuntimeメソッドを呼び出すと、常にSecurity Exceptionの異常を引き起こす。
二、APIプレビュー    add Shutdown Hook(Thread hook)       新しい仮想マシンを登録してフックをオフにします。     available Processors()       Java仮想マシンに対応するプロセッサの数を返します。     exec(String command)       個別のプロセスで指定された文字列コマンドを実行します。     exec(String[]cmdarray)       個別のプロセスで指定コマンドと変数を実行します。     exec(String[]cmdarray,String[]envp)       指定された環境の独立したプロセスでコマンドと変数を実行します。     exec(String[]cmdarray,String[]envp,File dir)       指定された環境とワークディレクトリの個別プロセスで指定されたコマンドと変数を実行します。     exec(String command,String[]envp)       指定された環境の個別プロセスで指定された文字列コマンドを実行します。     exec(String command,String[]envp,File dir)       指定された環境とワークディレクトリがある個別プロセスで指定された文字列コマンドを実行します。     exit(int status)       仮想マシンのクローズシーケンスを起動することにより、現在実行中のJava仮想マシンを終了します。     free Memory()       Java仮想マシンの空きメモリ量を返します。     gc()       ゴミ回収器を実行します。     InputStream get Localized InputStream(InputStream in)       時代遅れJDK 1.1からローカル符号化されたバイトストリームをUnicode文字ストリームに変換する第一の方法は、InputStreamReaderおよびBufferedierクラスを使用することである。     OutputStream get Localized Output Stream(Output Stream out)       時代遅れJDK 1.1からUnicode文字ストリームをローカル符号化バイトストリームに変換する第一の方法は、OutputStreamWriter、BufferedWriter、PrintWriter類を使用することである。     getRuntime() 
     現在のJavaアプリケーションに関する実行時オブジェクトを返します。     halt(int status)       現在実行中のJava仮想マシンを強制終了します。     ロード(String filename)       ダイナミックライブラリとして指定されたファイル名を読み込みます。     loadLibrary(String libname)       指定された倉庫名を持つダイナミックライブラリをロードします。     マックスメモリ()       Java仮想マシンの最大メモリ量を返します。     removeShutdown Hook(Thread hook)       前に登録した仮想マシンの登録をキャンセルしてフックをオフにします。     run Finalization()       finalizationのすべてのオブジェクトの終了方法を実行します。     run FinalizerOnExit(value)       時代遅れこの方法自体は不安全性を持っています。これは、使用中のオブジェクトに対して終了方法を呼び出すことができますが、他のスレッドがこれらのオブジェクトを操作しているため、不正な挙動やデッドロックを引き起こすことがあります。     トートメモリ()       Java仮想マシンのメモリの合計を返します。     trace Instructions(on)       コマンドトレースを有効/無効にします。     tracceMethodCalls(on)       トレースの呼び出しを有効/無効にします。
 
 
 
三、よくある応用
1、メモリ管理:Javaは不要なユニットの自動収集メカニズムを提供しています。totalMemory()とfree Memory()の方法で対象のメモリの大きさがどれぐらい残っているかを知ることができます。Javaは定期的にごみの対象(未使用のオブジェクト)を回収してメモリ空間を解放します。しかし、収集器の次の指定周期よりも前に廃棄対象を収集するには、必要に応じて、gc()メソッドを呼び出して不要なセル収集器を実行することができる。良い試験方法はまずgc()の方法を呼び出して、free Memory()の方法を呼び出して基本的なメモリの使用状況を調べて、それからコードを実行して、それから再度free Memory()の方法を呼び出して、どれぐらいのメモリを割り当てたか見てみます。以下の手順でこの構想を実証した。
 
//この実例は「javaコア技術」巻一から来ています。
class MemoryDemo{ 
        public static void main(String args[]){ 
                Runtime r = Runtime.getRuntime(); 
                long mem1,mem2; 
                Integer someints[] = new Integer[1000]; 
                System.out.println("Total memory is :" + r.totalMemory()); 
                mem1 = r.freeMemory(); 
                System.out.println("Initial free is : " + mem1); 
                r.gc(); 
                mem1 = r.freeMemory(); 
                System.out.println("Free memory after garbage collection : " + mem1); 
                //allocate integers 
                for(int i=0; i<1000; i++) someints[i] = new Integer(i);    
                mem2 = r.freeMemory(); 
                System.out.println("Free memory after allocation : " + mem2); 
                System.out.println("Memory used by allocation : " +(mem1-mem2));    
                //discard Intergers 
                for(int i=0; i<1000; i++) someints[i] = null; 
                r.gc(); //request garbage collection 
                mem2 = r.freeMemory(); 
                System.out.println("Free memory after collecting " + "discarded integers : " + mem2); 
        } 
}
コンパイル後の運転結果は以下の通りです。(異なるマシンによっては時間運行の結果も同じではないです。):Total memory is:203666 Initial free is:18181848 Free memory after garbage collection:188888 Free memory after allocation:187224 Memory byallocation:16584 Fred
2、他のプログラムを実行して安全な環境において、マルチタスクオペレーティングシステムでJavaを使って他の特別なプロセス(つまりプログラム)を実行することができます。ec()メソッドには実行したいプログラムとその入力パラメータをいくつかの形で命名しています。ec()メソッドはProcessオブジェクトに戻り、このオブジェクトを使ってJavaプログラムを制御して新しい実行のプロセスと対話することができます。ec()方法の本質は環境に依存する。次の例は、ececec()を使ってWindowsのメモ帳notepadを起動します。この例はWindows OSで実行しなければならない。
 
//この実例は「Javaコア技術」巻一から来ています。
 
クラス ExecDemo{ 
        
public 
static 
void main(String args[]){ 
                Runtime r=Runtime.getRuntime() 
                Process p= 
null 
                
try{ 
                        p=r.exec(
「notepad」) 
                } 
catch (Exception e){ 
                        System.out.println(
Errer executing notepad.); 
                } 
        } 
)
ecec()は他にもいくつかありますが、例では最もよく使われています。Processオブジェクトに戻ると、新しいプログラムが起動したらProcessの方法が使えます。destory()で子プロセスを殺すことができます。また、ワitFor()を使ってプログラムが終了するまで待つこともできます。exitValue()方法は、サブプロセスが終了したときに返される値を返します。エラーがなければ、0を返します。以下は、ecec()メソッドの例についての改良バージョンです。実行が終了するまで待機するように変更されました。
//この例は「Javaコア技術」巻の一class ExecDemoFini{    public static void main(String args){        Runtime r=Runtime.getRuntime()        Process p=null        try{            p=r.exec(「notepad」)            p.waitFor()        } catch(Exception e){            System.out.println(Errer executing notepad.)        }        System.out.println(「Notepad returned」+p.exitValue();    }}以下は実行の結果です。(メモ帳を閉じたら、プログラムを実行します。情報を印刷します。):Notepad returned 0は任意のボタンを押して続けてください。
 
 
サブプロセスが実行中の場合、標準入出力を読み書きできます。getOutputStreamメソッドとget InPutStream()メソッドは、サブプロセスの標準入出力に戻ります。
 
四、SUN会社からのjava.long.Runtime類のAPI文書はネット上にchm中国語版があり、探しやすいです。調べるためにSUN会社のJavaDocサイトからRuntime類のAPI文書をコピーしました。