Java 如何关闭jbpm引擎并将其释放';s资源

Java 如何关闭jbpm引擎并将其释放';s资源,java,drools,jbpm,Java,Drools,Jbpm,我现在使用embed jbpm 6.2作为我的公共服务,因此我编写了一个包含jbpm服务的jar,然后我使用URL类加载器加载它,它运行得很好,但是在我关闭jbpm引擎并尝试删除jar后,有些jar我无法删除 下面是在jar中初始化jbpm引擎的代码 try { emf = Persistence.createEntityManagerFactory(Constants.JBPM_JPA_UNIT_NAME); DBUserGroupCallbackIm

我现在使用embed jbpm 6.2作为我的公共服务,因此我编写了一个包含jbpm服务的jar,然后我使用URL类加载器加载它,它运行得很好,但是在我关闭jbpm引擎并尝试删除jar后,有些jar我无法删除

下面是在jar中初始化jbpm引擎的代码

    try {
        emf = Persistence.createEntityManagerFactory(Constants.JBPM_JPA_UNIT_NAME);

        DBUserGroupCallbackImpl callback = new DBUserGroupCallbackImpl(props);

        RuntimeEnvironmentBuilder kBuilder = RuntimeEnvironmentBuilder.getDefault()
                .classLoader(this.getClass().getClassLoader())
                .entityManagerFactory(emf)
                .userGroupCallback(callback)
                .persistence(true);

        String path = props.getProperty(Constants.BPMN_RESOURCE_PATH);
        logger.debug("Get bpmn resource with path = {}", path);
        if (!StringUtil.isEmpty(path)) {
            String[] paths = path.split(";");
            List<File> files = getFile(paths);
            if (files != null && !files.isEmpty()) {
                List<Resource> resources = getResource(files);
                if (resources != null && !resources.isEmpty()) {
                    for (Resource resource : resources) {
                        kBuilder.addAsset(resource, ResourceType.BPMN2);
                        logger.info("Add asset to jbpm success, resource = {}", resource);
                    }
                }
            }
        }

        runtimeManager = RuntimeManagerFactory.Factory.get().newSingletonRuntimeManager(kBuilder.get());

        runtime = runtimeManager.getRuntimeEngine(EmptyContext.get());

        this.kiesession = runtime.getKieSession();

        this.taskService = runtime.getTaskService();
现在,我使用如下代码删除JAR:

jbpmService.close();
urlcloassloader.close();
System.gc();
// waiting 1min
FileUtil.forceDelete(dir)

大多数jar都已删除,但我无法删除drools-core-6.2.0.Final.jar和postgresql-42.0.0.jre7.jar,有人知道原因吗?

检查这些文件为什么无法删除,权限是可能的原因,然后清除障碍。@laune tks laune,但如何检查?我想可能存在一些线程或对象没有释放资源,但我找不到它,也不知道如何在文档中执行。docs.jboss.org/jbpm/release/6.2.0.Final/jbpm-docs/htmlIt可以合理地假设JVM本身正在使用jar,那么它为什么要切断它所在的分支呢?终止Java应用程序并使用一些OS命令来清理文件空间。(虽然我不太明白你为什么要这么彻底。这些JAR不打算在下次运行时使用吗?@laune,这是因为我们使用java开发了一个微服务框架,jvm就像一个容器,业务模块更像一些JAR,一个容器可以加载多个模块。所以,当客户想要更新他的模块时,我必须清理罐子并在后端重新加载罐子。但是,即使我调用close方法,jbpm引擎似乎也没有释放jvm中的所有jar。
jbpmService.close();
urlcloassloader.close();
System.gc();
// waiting 1min
FileUtil.forceDelete(dir)