@NotNull
  public Future<?> release(@NotNull Target target, @Nullable Parameters configuration) {
    List<Info> infos = new ArrayList<>();
    synchronized (myProcMap) {
      for (Pair<Target, Parameters> key : myProcMap.keySet()) {
        if (key.first == target && (configuration == null || key.second == configuration)) {
          Info o = myProcMap.get(key);
          if (o.handler != null) infos.add(o);
        }
      }
    }
    if (RemoteObject.IN_PROCESS) {
      synchronized (myInProcMap) {
        for (Iterator<Pair<Target, Parameters>> it = myInProcMap.keySet().iterator(); it.hasNext(); ) {
          Pair<Target, Parameters> key = it.next();
          if (key.first == target && (configuration == null || key.second == configuration)) {
            it.remove();
          }
        }
      }
    }
    return infos.isEmpty() ? CompletableFuture.completedFuture(null) : ApplicationManager.getApplication().executeOnPooledThread(() -> {
      destroyProcessesImpl(infos);
      fireModificationCountChanged();
      for (Info o : infos) {
        o.handler.waitFor();
      }
    });
  }
@NotNull
  public Future<?> release(@NotNull Target target, @Nullable Parameters configuration)