docs: public void free()
      {
          MessageApp messageApplication = this.getMessageApplication(null, Utility.getSystemSuffix(this.getProperty(DBConstants.SYSTEM_NAME), this.getProperty(DBConstants.DEFAULT_SYSTEM_NAME)));
  
          if (m_vApplication != null)
          {
              for (int i = this.getApplicationCount() - 1; i >= 0;  i--)
              {
                  BaseApplication app = (BaseApplication)this.m_vApplication.get(i);
                  if (app != messageApplication)
                  {
                      app.setEnvironment(null); // So it doesn't try to free me.
                      app.free();
                  }
              }
              m_vApplication = null;
          }
          
          messageApplication = this.getMessageApplication(null, Utility.getSystemSuffix(this.getProperty(DBConstants.SYSTEM_NAME), this.getProperty(DBConstants.DEFAULT_SYSTEM_NAME)));
          if (messageApplication != null)
          {
              messageApplication.setEnvironment(null);  // So it doesn't try to free me.
              this.removeApplication(messageApplication);
              messageApplication.free();
          }
          
          m_applicationDefault = null;    // Will have been freed
          
          if (m_PhysicalDatabaseParent != null)
          {
              m_PhysicalDatabaseParent.free();
              m_PhysicalDatabaseParent = null;
          }
          
          if (gEnv == this)
          	gEnv = null;
          
          if (ClassServiceUtility.getClassService().getClassFinder(null) != null)
              ClassServiceUtility.getClassService().getClassFinder(null).shutdownService(Env.class.getName(), this);	// Careful of circular calls
      }