http://oshiete1.goo.ne.jp/kotaeru.php3?q=1061886&rev=1
実行結果をSwingで表示 - 教えて!goo
-verbose:gc の出力は、標準出力ですので、リダイレクトして取り出してやります。
この場合、URL先の
(2)Runtime#exec()
(3)Runtime#exec()は使わないが、「標準出力のリダイレクト」は利用
の方法のどちらかを使うと実現できます。プロセスが別でも良いなら(2)を、同一のプロセスでやりたいなら(3)で実現すると良いと思います。
(2)Runtime#exec()
方法3. Runtime#exec()は使わないが、「標準出力のリダイレクト」は利用
[Q2]にRuntime#exec()の使用例があります。
http://www.hatena.ne.jp/1104341857#
人力検索はてな - Javaで-verbose:gcの出力をTextAreaに表示したい
URLはダミーです。
JVMの標準出力を取り出しますので、OSレベルのリダイレクトを利用する必要があります。
起動プロセスと実行プロセスを分けて、起動プロセスで、Process#getInputStream()をポーリングし、取得した結果をプロセス間通信を使ってメインプロセスへ送信してあげるのがよろしいかと思います。プロセス間通信としては、afternoontea様が想像されているソケットまたはRMIを使えばいけるのではないでしょうか。
別の代案としては、メインプロセスを実行するために java クラス名 としているところを
java クラス名 > gclog.txt
のようにOSレベルのリダイレクトとして出力しておき、そのファイル(上の例ではgclog.txt)をメインプロセスから読み込み専用でオープンしたファイルストリームで取得すればいけると思います。
これで、2回目の回答となりますので、今後の回答はいわしにて行いたいと思います。
ご希望ならサンプル作成しますのでいわしにてご連絡ください。
ソケットを使う方法でやってみます。
ありがとうございました。
やりたいのは同一プロセス上です。
自プロセスのGCの発生を画面に表示したいのですが(3)のSystem#setOut()ではVMの出力する
[GC 1133K->627K(3136K), 0.0011828 secs]
という文字列を取得することができません。
System.out.println()したものは取得できるのですが…。
これはもしかして外部コマンドとして実行してProcess#getInputStream()をアプリケーションのServerSocketへ送るとかやらないとダメなのでしょうか?