0

Process myProcess = Runtime.getRuntime.exec(cmd) を使用している Web アプリケーションです。現在、Ubuntu Linux でホストされている Tomcat を使用して展開されています。

このアプリケーションは、私の開発マシン (Core2 duo、2GB RAM OS: UBUNTU 11.04) で正常に動作します。

ただし、仮想サーバー (1GB RAM、Xeon プロセッサ) で同じものをホストすると、Runtime.getRuntime.exec(cmd) 呼び出しが失敗します。サブプロセスを作成できません。

同じサブプロセスが作成され、開発マシンで期待どおりの出力が得られました。

アプリケーションでは、Tomcat にデプロイされたサーブレットで Java クラスを呼び出しており、正常に実行され、出力も問題ありません。以下は同じコードスニペットです。

from the servlet
uploadservlet.java
+-----------+   
CalculateDuration dur=new CalculateDuration();
Map<String, Integer> durationmap=dur.conversion(al);
+-------------+

Caclulateduration.java
+------------------+
{
     conversion(ArrayList<String> b)
     {

      StringBuilder sb = new StringBuilder();
          sb.append( "hello.o"); /* Name of the sample executable */         
       ...

          Process p = Runtime.getRuntime().exec(sb.toString() ); //struck at this line.subprocess not created on my vps system 

      ...

          +------------------+

Standalone Caclulateduration.java は、仮想サーバー上で実行されます。

この問題は、仮想サーバーの物理メモリが不足している (getRunTime が失敗する) ために発生する可能性がありますか、ここに何かが欠けている可能性があります。ルート化するためのツール、コマンド、またはメソッドがこの問題を引き起こします。

ご意見をお待ちしております。

4

1 に答える 1

0

Runtime.exec()1.7 より前の Javaはfork()/exec()、プロセスを生成するために使用します。フォークとは、現在のプロセスを複製することを意味します。これは、Java アプリケーションであるため、おそらく巨大です。アプリケーションを fork() できるようにするには、十分な仮想アドレス空間が利用可能である必要があります。十分な容量は、OS のメモリ オーバーコミット設定によって異なります。

このすべての問題を回避するために、Java 1.7 (Sun/OpenJDK/...) は と をサポートしvfork()/exec()ていposix_spawn()ます。posix_spawn()新しいプロセスを直接生成しますがvfork()、差し迫ったexecve().

于 2012-11-23T20:24:40.083 に答える