code: public void destroy() throws ServletException
      {
          try
          {
              // destroy the filter instance
              _filterState = FILTER_STATE_DESTROYING;
              
  			for (int i = 0;(nServicing.get() > 0) && i < 60; i++) {
  				try {
  					if (i == 0)
  					{
  						logger.logp(Level.INFO, CLASS_NAME,"destroy", "waiting.to.destroy.filter.[{0}]", _filterName);
  					}
  					Thread.sleep(1000);
  				}
  				catch (InterruptedException e) {
  					com.ibm.wsspi.webcontainer.util.FFDCWrapper.processException(e, "com.ibm.ws.webcontainer.servlet.ServletInstance.destroy", "377", this);
  				}
  			}
  
  			if(_eventSource != null && _eventSource.hasFilterListeners()){
  				// LIDB-3598: begin
  				_eventSource.onFilterStartDestroy(getFilterEvent());
  				// LIDB-3598: end
  				_filterInstance.destroy();
  				// LIDB-3598: begin
  				_eventSource.onFilterFinishDestroy(getFilterEvent());
  				// LIDB-3598: end
  			}
  			else{
  				_filterInstance.destroy();
  			}
  
  			_filterState = FILTER_STATE_DESTROYED;
  			if (null != _managedObject){
  			    _managedObject.release();
  			}
          }
          catch (Throwable th)
          {
      		if(_eventSource != null && _eventSource.hasFilterErrorListeners()){
  	        	FilterErrorEvent errorEvent = getFilterErrorEvent(th);
  	        	_eventSource.onFilterDestroyError(errorEvent);
      		}
              com.ibm.wsspi.webcontainer.util.FFDCWrapper.processException(th, "com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.destroy", "173", this);
              _filterState = FILTER_STATE_UNAVAILABLE;
              throw new ServletException(MessageFormat.format("Filter [{0}]: could not be destroyed", new Object[] {_filterName}), th);
          }
      }
docs: Destroys the filter wrapper and the underlying filter instance