diff options
author | Eike Stepper | 2007-09-18 15:51:05 +0000 |
---|---|---|
committer | Eike Stepper | 2007-09-18 15:51:05 +0000 |
commit | c561762431c67d37c46ca1de7a0788473a1b3c6d (patch) | |
tree | 779c77a1aeb80b4ba065323af8c298475b5439d7 /plugins/org.eclipse.net4j.tests | |
parent | f89cf319aa1a1a725882947c9702a8e4ba52515d (diff) | |
download | cdo-c561762431c67d37c46ca1de7a0788473a1b3c6d.tar.gz cdo-c561762431c67d37c46ca1de7a0788473a1b3c6d.tar.xz cdo-c561762431c67d37c46ca1de7a0788473a1b3c6d.zip |
[203538] Limit memory consumption in CDORevisionResolverImpl
https://bugs.eclipse.org/bugs/show_bug.cgi?id=203538
Diffstat (limited to 'plugins/org.eclipse.net4j.tests')
-rw-r--r-- | plugins/org.eclipse.net4j.tests/CacheTest.launch (renamed from plugins/org.eclipse.net4j.tests/Net4j MonitorTest.launch) | 6 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch | 16 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch | 16 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch | 16 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java | 54 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java | 81 | ||||
-rw-r--r-- | plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java | 156 |
7 files changed, 295 insertions, 50 deletions
diff --git a/plugins/org.eclipse.net4j.tests/Net4j MonitorTest.launch b/plugins/org.eclipse.net4j.tests/CacheTest.launch index 42c7782088..63894f3870 100644 --- a/plugins/org.eclipse.net4j.tests/Net4j MonitorTest.launch +++ b/plugins/org.eclipse.net4j.tests/CacheTest.launch @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <launchConfiguration type="org.eclipse.jdt.junit.launchconfig"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/MonitorTest.java"/> +<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java"/> </listAttribute> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listEntry value="1"/> @@ -9,11 +9,13 @@ <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> <listAttribute key="org.eclipse.debug.ui.favoriteGroups"> <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/> +<listEntry value="org.eclipse.debug.ui.launchGroup.run"/> </listAttribute> <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/> <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.util.tests.MonitorTest"/> +<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.util.tests.cache.CacheTest"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/> +<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms10M -Xmx100M"/> </launchConfiguration> diff --git a/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch b/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch deleted file mode 100644 index 666182b471..0000000000 --- a/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<launchConfiguration type="org.eclipse.jdt.junit.launchconfig"> -<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.tests.SignalTest"/> -<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalTest.java"/> -</listAttribute> -<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/> -</launchConfiguration> diff --git a/plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch b/plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch deleted file mode 100644 index 1dee27575d..0000000000 --- a/plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.jdt.junit.launchconfig"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/org.eclipse.net4j.tests"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="4"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/> -<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> -<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> -<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.util.tests.SynchronizingCorrelatorTest"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/> -</launchConfiguration> diff --git a/plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch b/plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch deleted file mode 100644 index 7d0ee890f0..0000000000 --- a/plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.jdt.junit.launchconfig"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TCPTransportTest.java"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/> -<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/> -<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/> -<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.tests.TCPTransportTest"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/> -</launchConfiguration> diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java new file mode 100644 index 0000000000..2d1f72a1ff --- /dev/null +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java @@ -0,0 +1,54 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.util.tests.cache; + +import org.eclipse.net4j.internal.util.cache.CacheMonitor; +import org.eclipse.net4j.internal.util.cache.ThresholdConditionPolicy; +import org.eclipse.net4j.util.cache.ICacheMonitor.ConditionPolicy; +import org.eclipse.net4j.util.tests.AbstractOMTest; + +/** + * @author Eike Stepper + */ +public class CacheTest extends AbstractOMTest +{ + public void testLifecycle() throws Exception + { + ConditionPolicy conditionPolicy = new ThresholdConditionPolicy(1000000L, 10000000L); + + CacheMonitor cacheMonitor = new CacheMonitor(); + cacheMonitor.setConditionPolicy(conditionPolicy); + cacheMonitor.setPauseRED(100L); + cacheMonitor.setPauseYELLOW(100L); + cacheMonitor.setPauseGREEN(100L); + cacheMonitor.setDaemon(true); + cacheMonitor.activate(); + + RevisionManager revisionManager = new RevisionManager(); + revisionManager.setCacheMonitor(cacheMonitor); + revisionManager.activate(); + + for (int version = 1; version <= 10; version++) + { + for (int id = 1; id <= 100; id++) + { + Revision revision = revisionManager.getRevision(id, version); + Thread.sleep(20); + } + + System.gc(); + Thread.sleep(1000); + } + + revisionManager.deactivate(); + cacheMonitor.deactivate(); + } +} diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java new file mode 100644 index 0000000000..1dd267e128 --- /dev/null +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java @@ -0,0 +1,81 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.util.tests.cache; + +import java.lang.ref.PhantomReference; +import java.lang.ref.ReferenceQueue; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Eike Stepper + */ +public class Revision +{ + private int id; + + private int version; + + private byte[] data = new byte[100000]; + + public Revision(int id, int version) + { + this.id = id; + this.version = version; + } + + public int getID() + { + return id; + } + + public int getVersion() + { + return version; + } + + public byte[] getData() + { + return data; + } + + @Override + public String toString() + { + return "R" + id + "v" + version; + } + + @SuppressWarnings("unchecked") + private static Set finalized = new HashSet(); + + @SuppressWarnings("unchecked") + private static List refs = new ArrayList(); + + @SuppressWarnings("unchecked") + private static ReferenceQueue queue = new ReferenceQueue(); + + @Override + protected void finalize() throws Throwable + { + System.err.println("FINALIZE " + this); + long token = id; + token <<= 32; + token |= version; + if (!finalized.add(token)) + { + System.err.println("************************************************************************"); + } + + refs.add(new PhantomReference<Revision>(this, queue)); + } +} diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java new file mode 100644 index 0000000000..9b4fa66973 --- /dev/null +++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java @@ -0,0 +1,156 @@ +/*************************************************************************** + * Copyright (c) 2004 - 2007 Eike Stepper, Germany. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + **************************************************************************/ +package org.eclipse.net4j.util.tests.cache; + +import org.eclipse.net4j.internal.util.cache.Cache; + +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * @author Eike Stepper + */ +public class RevisionManager extends Cache<Revision> +{ + private Map<Integer, TimeLine> timeLines = new HashMap<Integer, TimeLine>(); + + public RevisionManager() + { + } + + public Revision getRevision(int id, int version) + { + TimeLine timeLine = timeLines.get(id); + if (timeLine == null) + { + timeLine = new TimeLine(id); + timeLines.put(id, timeLine); + } + + return timeLine.getRevision(version); + } + + public void evictElements(int elementCount) + { + } + + protected Revision loadRevision(int id, int version) + { + Revision revision = new Revision(id, version); + System.out.println("Loaded " + revision + " (free=" + Runtime.getRuntime().freeMemory() + ", total=" + + Runtime.getRuntime().totalMemory() + ", max=" + Runtime.getRuntime().maxMemory() + ")"); + return revision; + } + + protected int getRevisionSize(Revision revision) + { + return 1; + } + + @Override + protected void unreachableElement(Reference<? extends Revision> reference) + { + System.out.println("Unreachable: " + reference); + } + + /** + * @author Eike Stepper + */ + private class TimeLine + { + private int id; + + private List<Reference<Revision>> revisions = new ArrayList<Reference<Revision>>(); + + public TimeLine(int id) + { + this.id = id; + } + + public int getID() + { + return id; + } + + public Revision getRevision(int version) + { + for (Iterator<Reference<Revision>> it = revisions.iterator(); it.hasNext();) + { + Reference<Revision> reference = it.next(); + Revision revision = reference.get(); + if (revision != null) + { + if (revision.getVersion() == version) + { + return revision; + } + } + else + { + it.remove(); + break; + } + } + + long time = System.currentTimeMillis(); + Revision revision = loadRevision(id, version); + time = System.currentTimeMillis() - time; + int size = getRevisionSize(revision); + + revisions.add(new CacheElement(revision, getReferenceQueue())); + return revision; + } + } + + /** + * @author Eike Stepper + */ + private static final class CacheElement extends WeakReference<Revision> + { + private int id; + + private int version; + + public CacheElement(Revision revision, ReferenceQueue<Revision> queue) + { + super(revision, queue); + id = revision.getID(); + version = revision.getVersion(); + } + + public int getID() + { + return id; + } + + public int getVersion() + { + return version; + } + + public Revision getRevision() + { + return get(); + } + + @Override + public String toString() + { + return "Ref" + id + "v" + version + (get() == null ? " cleared" : " set"); + } + } +} |