Java 如何完全关闭包含servlet的undertow服务器

Java 如何完全关闭包含servlet的undertow服务器,java,undertow,Java,Undertow,我已经按照以下文档中的方法创建了一个带有servlet部署的undertow服务器: 我现在试图停止servlet中的服务器和应用程序 调用server.stop()会使指定端口上的服务器不可用,但当我再次调用server.start()时,应用程序立即可用(如果已停止,则需要一些时间才能再次启动)。我还可以看到,在调用server.stop时,服务器的内存没有被释放。我尝试了各种组合,包括调用deploymentManager.undeploy(),所有组合都具有相同的效果 我已在文件中搜寻

我已经按照以下文档中的方法创建了一个带有servlet部署的undertow服务器:

我现在试图停止servlet中的服务器和应用程序

调用
server.stop()
会使指定端口上的服务器不可用,但当我再次调用
server.start()
时,应用程序立即可用(如果已停止,则需要一些时间才能再次启动)。我还可以看到,在调用
server.stop
时,服务器的内存没有被释放。我尝试了各种组合,包括调用
deploymentManager.undeploy()
,所有组合都具有相同的效果

我已在文件中搜寻任何线索,结果一无所获。我想知道是否还有其他人有任何线索?下面是当前状态下的源代码(请注意,我不是Java开发人员,因此会有很多花里胡哨的东西):


您保留了对下拖组件的强引用,以及它们直接引用的任何内容。引用存储在以下字段中:

private DeploymentManager deploymentManager;
private Undertow          undertowServer;
private DeploymentInfo    servletInfo;
这不是一个关于底层的问题,而是JVM如何工作的问题。垃圾收集器从一组根开始(将这些根视为JVM上的线程),并遍历对其他对象的所有引用。一旦完成遍历,所有不可访问的对象都将被回收。这是整个过程的逻辑观点。收集时间取决于JVM以及各代。如果将组件放置在#shutdown()方法中,以下代码将删除对组件的引用:

注意:一旦执行此操作,您将无法重新启动。

将管理端口(8090,如tomcat中的)拖到下面:
考虑到您的答案,经过一些进一步的重构来改变我构建服务器的方式之后,我现在可以做到这一点了。看来你已经穿上了,谢谢。
private DeploymentManager deploymentManager;
private Undertow          undertowServer;
private DeploymentInfo    servletInfo;
   deploymentManager = null;
   undertowServer = null;
   servletInfo = null;
 PathHandler path = Handlers.path()
                .addPrefixPath("/quitQuit", new QuitHandler());
        Undertow.Builder builder = Undertow.builder()
                .setHandler(path)
                .addHttpListener(8090, "0.0.0.0");
...
public class QuitHandler implements HttpHandler {
    @Override
    public void handleRequest(HttpServerExchange hse) throws Exception {
        // some log info...
          System.exit(0);
    }
}