package de.hub.emffrag.util; import org.eclipse.emf.ecore.resource.Resource; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import de.hub.emffrag.EmfFragActivator; import de.hub.emffrag.fragmentation.FGlobalEventListener; import de.hub.emffrag.fragmentation.FInternalObjectImpl; import de.hub.emffrag.fragmentation.FObjectImpl; import de.hub.emffrag.fragmentation.UserObjectsCache; public class MemoryGlobalEvenListener implements FGlobalEventListener { private final Cache<FInternalObjectImpl, FInternalObjectImpl> allInstances = CacheBuilder.newBuilder().weakKeys().weakValues().build(); private final Cache<FInternalObjectImpl, FInternalObjectImpl> definitelyUnloaded = CacheBuilder.newBuilder().weakKeys().weakValues().build(); private long removedInstances = 0; @Override public void onInternalObjectCreated(FInternalObjectImpl internalObject) { allInstances.put(internalObject, internalObject); } @Override public void onInternalObjectSetResource(FInternalObjectImpl internalObject, Resource resource) { } @Override public void onUserObjectCreated(FInternalObjectImpl internalObject, FObjectImpl userObject) { } @Override public void onUnloadInternalObject(FInternalObjectImpl internalObject) { } public void removeUnessesaryObjects() { allInstances.cleanUp(); allInstances.size(); for (FInternalObjectImpl instance: allInstances.asMap().keySet()) { if (!UserObjectsCache.instance.hasUserObject(instance) && instance.eResource() == null) { allInstances.asMap().remove(instance); definitelyUnloaded.put(instance, instance); instance.trulyUnload(); removedInstances++; } } System.gc(); EmfFragActivator.instance.info("Removed unnesseary objects: " + allInstances.size() + " instances and " + definitelyUnloaded.size() + "(" + removedInstances + ") removed instances."); } }