任何支持Process.supportsNormalTermination == true的VM?

JMa*_*Max 5 java kill process java-9

Java 9的一个新特性是它不仅可以强制杀死SIGKILL它创建的进程(意思是),而且还可以支持发送SIGTERM(在Java中称为"正常终止").

根据Process的文档,可以查询实现是否支持:

public boolean supportsNormalTermination()如果destroy()的实现是正常终止进程,则返回true,如果执行destroy强制并立即终止进程,则返回false.在ProcessBuilder.start()和Runtime.exec(java.lang.String)返回的Process对象上调用此方法将返回true或false,具体取决于平台实现.

我使用Oracle JRE 9.0.1(Windows 64位)进行了一些测试:

Process p = Runtime.getRuntime().exec("javaw -cp target/classes TestClassWait10Minutes");
p.waitFor(5, TimeUnit.SECONDS);
System.out.println(p.supportsNormalTermination());
Run Code Online (Sandbox Code Playgroud)

但是,似乎Oracle JRE不支持"正常终止",因为我总是得到false.

由于它依赖于"平台实现",Java 9似乎定义了它但没有实现它.

有人知道在任何可用的Java VM中,"正常终止"的功能是否可用?

man*_*uti 5

在Linux实现上,似乎支持正常终止。从来源ProcessImpl

// Linux platforms support a normal (non-forcible) kill signal.
static final boolean SUPPORTS_NORMAL_TERMINATION = true;

...

@Override

public boolean supportsNormalTermination() {
    return ProcessImpl.SUPPORTS_NORMAL_TERMINATION;
}
Run Code Online (Sandbox Code Playgroud)

Windows上则不然。

  • https://bugs.openjdk.java.net/browse/JDK-8056139 可能解决了这个问题,但仍然开放。 (2认同)