1

私は次のものを持っています

System.setSecurityManager(new SecurityManager() {
    @Override
    public void checkExit(int status) {
        super.checkExit(status);

        //custom exception extends SecurityException
        throw new SystemExitCalledException();
    }
});

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        //never reaches here somehow... 
        //maybe some3rdPartyStaticMethod sets this, too?
    }

});


try {
    //this method spawns threads and some call System.exit().
    some3rdPartyStaticMethod.invoke(null, new Object[]{args});
} catch (SystemExitCalledException e) {
    //it never reaches here because 
    //SystemExitCalledException is thrown on different thread?? 
    //
}

some3rdPartyStaticMethod の生成されたスレッドの System.exit() 呼び出しが jvm を停止するのを防ぐ方法はありますか?

4

2 に答える 2

2

別のプロセスでコードを開始し、RMI を使用して通信できます。サードパーティのコードSystem.exitがそのプロセスを呼び出して強制終了した場合、プロセスは引き続き実行され、必要に応じて子プロセスを再作成できます。

このアプローチにはいくつかの注意点があることに注意してください。

  • 2 つのプロセスは同じヒープ領域を共有しません。
  • 2 つのプロセス間で渡されるすべてのデータをマーシャリングする必要があります。これは、データがシリアライズ可能でなければならないことを意味します。
  • メソッド呼び出しごとにかなりのオーバーヘッドが発生します。これにより、1 秒間に多くの呼び出しを行う必要がある場合、パフォーマンスの問題が発生する可能性があります。
于 2012-04-14T13:01:28.053 に答える
1

カスタム SecurityManager ポリシーを作成すると役立つはずです-私はこれを自分で行ったことはありません:)

この投稿によると(一番下までスクロール):

ただし、VM 内の何かが System.exit() を呼び出そうとすると、VM は終了します。これには mvn の残忍な撃墜が含まれているため、通常の mvn プロセスが中断されます。SecurityManager を使用して、コードが System.exit() を呼び出さないようにすることができますが、副作用については誰も言及していません。

私の同僚は、VM の起動時にポリシーをシステム全体、ユーザーごと、およびシステム プロパティとしてセットアップできると述べました。簡単なテストの後、これで問題が解決することが証明されました。それ以来、(SecurityManager を設定する前に) 自分のコードから独自のポリシーを設定する方法を理解することができ、これで問題が解決しました。

次のコードを使用しました。

//Setup security to prevent System.exit()
SecurityManager sm = System.getSecurityManager();
URL policy = getClass().getClassLoader().getResource("jsdoc.policy");
System.setProperty("java.security.policy", policy.toString());
System.setSecurityManager(new JSDocSecurityManager(getLog()));

これを読み取る単純で広く開かれたポリシーファイルを使用すると、次のようになります。

grant {
  permission java.security.AllPermission;
};

それが機能する場合、System.exit()リクエストをキャプチャしてSecurityException代わりにスローするはずです

于 2012-04-14T13:09:06.420 に答える