これは、別々のプロセスを使用せずに1つのJavaアプリの中から可能です...この例では
良いアイデアだとは思いませんjarファイルを10回実行します。私は、標準のJarFileクラスを使ってメインクラスを照会し、それを新しいスレッドで実行します。また、私は、各インスタンスごとに別のクラスローダーを使用します。これがなければ、シングルトンは別々のアプリケーション間で衝突するので、これは重要です。 (実行可能なjarファイルをfoo.jarを中に含まれる)
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
try {
File file = new File("foo.jar");
JarFile jar = new JarFile(file);
String main = jar.getManifest().getMainAttributes()
.getValue(Name.MAIN_CLASS);
URLClassLoader freshLoader = new URLClassLoader(
new URL[] { file.toURI().toURL() }, null);
Class<?> classToLoad = Class.forName(main, true, freshLoader);
Class<?>[] argTypes = new Class[] { String[].class };
final String[] mainArgs = new String[] { "arg1", "arg2" };
final Method method = classToLoad.getMethod("main", argTypes);
Runnable job = new Runnable() {
@Override
public void run() {
try {
method.invoke(null, (Object) mainArgs);
} catch (Exception e) {
e.printStackTrace();
}
}
};
new Thread(job, "Thread :" + jarFile).start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
テストアプリクラスが
public class Main {
private static int counter;
public static void main(String[] args) {
JFrame frame = new JFrame("Test frame");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(2, 1));
frame.getContentPane().add(new JLabel("instance " + counter));
frame.getContentPane().add(
new JLabel("launched with " + Arrays.asList(args)));
frame.pack();
frame.setVisible(true);
counter++;
}
}
こんにちはグレンは、私はそのソースコードを持っていない...あなたのサードパーティのjarファイルをシミュレートします。そして私のために、私はそれを再設計する自信を持っていない。私はちょうど私達が速い私のPCを助けるために低CPUおよびメモリの使用法にjvmパラメータを設定できるかどうかについて考えています。 – yixuan
sun/oracle VMでは、 "java -Xms12m -Xmx12m -jar file.jar"のような-Xmsオプションを使用して、最小ヒープ・サイズを設定することができます。足跡の少ない多くのプロセスがあります。 –
12 MBがJVMには不十分かもしれません。 – mcfinnigan