code: @Override protected synchronized void done() {
          // dispose of canvas frames on the Event Dispatcher Thread...
          if (monitorWindows != null) {
              for (int i = 0; i < monitorWindows.length; i++) {
                  if (monitorWindows[i] != null) {
                      monitorWindows[i].dispose();
                      monitorWindows[i] = null;
                  }
              }
          }
          if (projectorFrame != null) {
              projectorFrame.dispose();
              projectorFrame = null;
              projectorConverter = null;
          }
  
          // force release of native memory
          System.gc();
          Pointer.deallocateReferences();
      }
docs: synchronized with doInBackground()...