gpt4 book ai didi

Java Runtime#halt() 不会停止 JVM

转载 作者:行者123 更新时间:2023-11-30 04:33:27 32 4
gpt4 key购买 nike

这是一个使用 RMI 的客户端/服务器应用程序。一旦服务器收到 destroy() 的 RMI 请求 - 我需要中止虚拟机。我正在使用 Runtime.getRuntime().halt(0) 来实现此目的。但是在调用halt()之后,虚拟机仍然存在,我杀死它的唯一方法是在OSX上使用Force Kill

调用线程的堆栈跟踪如下:

"RMI TCP Connection(3)-192.168.1.4" daemon prio=5 tid=7f99a7103000 nid=0x11d467000 runnable [11d464000]
java.lang.Thread.State: RUNNABLE
at java.lang.Shutdown.halt0(Native Method)
at java.lang.Shutdown.halt(Shutdown.java:95)
- locked <7f44c90d0> (a java.lang.Shutdown$Lock)
at java.lang.Runtime.halt(Runtime.java:256)
at net.sourceforge.marathon.runtime.JavaRuntime.destroy(JavaRuntime.java:178)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at net.sourceforge.rmilite.impl.RemoteInvocationHandlerImpl.invoke(RemoteInvocationHandlerImpl.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)

可能是什么问题?

最佳答案

我尝试了多种方法来完成这项工作。

  1. 已添加Runtime#runFinalization在调用halt()之前。
  2. 调用halt()SwingUtilities.invokeAndWait
  3. 调用halt()SwingUtilities.invokeLater

这些都不起作用。最后,

  1. 调用halt()在计时器任务中使用 Timer#schedule

这很有效,并且到目前为止一直有效。谢谢大家的回复。

关于Java Runtime#halt() 不会停止 JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044061/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com