Revision: 5861 http://jnode.svn.sourceforge.net/jnode/?rev=5861&view=rev Author: fduminy Date: 2011-08-24 18:27:24 +0000 (Wed, 24 Aug 2011) Log Message: ----------- added class name filter to OnHeapCommand
Signed-off-by: Fabien DUMINY <fdum...@jnode.org> Modified Paths: -------------- trunk/cli/descriptors/org.jnode.command.system.xml trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java Added Paths: ----------- trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java Modified: trunk/cli/descriptors/org.jnode.command.system.xml =================================================================== --- trunk/cli/descriptors/org.jnode.command.system.xml 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/cli/descriptors/org.jnode.command.system.xml 2011-08-24 18:27:24 UTC (rev 5861) @@ -220,6 +220,7 @@ <optionSet> <option argLabel="minCount" longName="minCount"/> <option argLabel="minTotalSize" longName="minTotalSize"/> + <option argLabel="className" longName="className"/> </optionSet> </syntax> <syntax alias="page"> Modified: trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java =================================================================== --- trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -27,7 +27,10 @@ import org.jnode.shell.syntax.Argument; import org.jnode.shell.syntax.IntegerArgument; import org.jnode.shell.syntax.LongArgument; +import org.jnode.shell.syntax.StringArgument; import org.jnode.vm.facade.HeapStatistics; +import org.jnode.vm.facade.ObjectFilter; +import org.jnode.vm.facade.SimpleObjectFilter; import org.jnode.vm.facade.VmUtils; /** @@ -37,17 +40,20 @@ private static final String help_inst = "the minimum instance count to show"; private static final String help_size = "the minimum total size to show"; + private static final String HELP_CLASSNAME = "the classname filter"; private static final String help_super = "Show the number of instances on the heap with memory usage"; private static final String str_on_heap = "On Heap:"; private final IntegerArgument argMinInstanceCount; private final LongArgument argMinTotalSize; + private final StringArgument className; public OnHeapCommand() { super(help_super); argMinInstanceCount = new IntegerArgument("minCount", Argument.OPTIONAL, 1, Integer.MAX_VALUE, help_inst); argMinTotalSize = new LongArgument("minTotalSize", Argument.OPTIONAL, 1L, Long.MAX_VALUE, help_size); - registerArguments(argMinInstanceCount, argMinTotalSize); + className = new StringArgument("className", Argument.OPTIONAL | Argument.MULTIPLE, HELP_CLASSNAME); + registerArguments(argMinInstanceCount, argMinTotalSize, className); } public static void main(String[] args) throws Exception { @@ -61,8 +67,16 @@ public void execute() throws Exception { PrintWriter out = getOutput().getPrintWriter(); out.println(str_on_heap); - final HeapStatistics stats = VmUtils.getVm().getHeapManager().getHeapStatistics(); + ObjectFilter filter = null; + if (className.isSet()) { + SimpleObjectFilter f = new SimpleObjectFilter(); + f.setClassName(className.getValues()); + filter = f; + } + + final HeapStatistics stats = VmUtils.getVm().getHeapManager().getHeapStatistics(filter); + if (argMinInstanceCount.isSet()) { stats.setMinimumInstanceCount(argMinInstanceCount.getValue()); } Modified: trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java =================================================================== --- trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/core/src/core/org/jnode/vm/facade/HeapStatistics.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -46,6 +46,14 @@ void setMinimumTotalSize(long bytes); /** + * Sets the object filter. If the filter accept the object, + * then it will be added to statistics. + * @param objectFilter + * + */ + void setObjectFilter(ObjectFilter objectFilter); + + /** * Write the statistical data to an {@link Appendable}. * * @param a Added: trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java =================================================================== --- trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java (rev 0) +++ trunk/core/src/core/org/jnode/vm/facade/NoObjectFilter.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -0,0 +1,24 @@ +package org.jnode.vm.facade; + +/** + * An {@link ObjectFilter} that accepts all objects. + * Call {@link NoObjectFilter#INSTANCE} to get the singleton. + * + * @author Fabien DUMINY (fdum...@jnode.org) + * + */ +public class NoObjectFilter implements ObjectFilter { + public static final NoObjectFilter INSTANCE = new NoObjectFilter(); + + private NoObjectFilter() { + } + + /** + * {@inheritDoc} + * <br>This implementation always returns true. + */ + @Override + public final boolean accept(String className) { + return true; + } +} Added: trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java =================================================================== --- trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java (rev 0) +++ trunk/core/src/core/org/jnode/vm/facade/ObjectFilter.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -0,0 +1,16 @@ +package org.jnode.vm.facade; + +/** + * This interface is used to filter objects founds on heap. + * + * @author Fabien DUMINY (fdum...@jnode.org) + * + */ +public interface ObjectFilter { + /** + * Does this filter accept the provided class ? + * @param className The class of the object. + * @return true if the filter accept the provided class. + */ + boolean accept(String className); +} Added: trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java =================================================================== --- trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java (rev 0) +++ trunk/core/src/core/org/jnode/vm/facade/SimpleObjectFilter.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -0,0 +1,42 @@ +package org.jnode.vm.facade; + + +/** + * An {@link ObjectFilter} that accepts objects whose class name contains + * the string given by {@link #className}. + * + * @author Fabien DUMINY (fdum...@jnode.org) + * + */ +public class SimpleObjectFilter implements ObjectFilter { + private String[] className = null; + + /** + * Sets the className filter. Any class whose full name contains a value + * from <code>classNameFilter</code> array will be accepted. Other classes + * will be ignored and no statistics will be computed and displayed for + * them. + * @param className + */ + public void setClassName(String[] className) { + this.className = ((className != null) && (className.length > 0)) ? className : null; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean accept(String className) { + if (className == null) { + return true; + } + + for (String f : this.className) { + if (className.contains(f)) { + return true; + } + } + + return false; + } +} Modified: trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java =================================================================== --- trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/core/src/core/org/jnode/vm/facade/VmHeapManager.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -91,10 +91,10 @@ /** * Get this heap's statistics. - * + * @param objectFilter The optional filter to apply to objects found on heap. * @return the heap statistics */ - HeapStatistics getHeapStatistics(); + HeapStatistics getHeapStatistics(ObjectFilter objectFilter); /** * Get this heap GC's statistics. Modified: trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java =================================================================== --- trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/core/src/core/org/jnode/vm/memmgr/VmHeapManager.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -35,6 +35,7 @@ import org.jnode.vm.classmgr.VmType; import org.jnode.vm.facade.GCStatistics; import org.jnode.vm.facade.HeapStatistics; +import org.jnode.vm.facade.ObjectFilter; import org.jnode.vm.facade.VmProcessor; import org.jnode.vm.facade.VmWriteBarrier; import org.jnode.vm.objects.VmSystemObject; @@ -321,7 +322,7 @@ /** * {@inheritDoc} */ - public abstract HeapStatistics getHeapStatistics(); + public abstract HeapStatistics getHeapStatistics(ObjectFilter objectFilter); /** * {@inheritDoc} Modified: trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java =================================================================== --- trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/core/src/core/org/jnode/vm/memmgr/def/DefHeapStatistics.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -25,6 +25,8 @@ import org.jnode.util.NumberUtils; import org.jnode.vm.facade.HeapStatistics; +import org.jnode.vm.facade.NoObjectFilter; +import org.jnode.vm.facade.ObjectFilter; import org.jnode.vm.objects.VmSystemObject; /** @@ -35,25 +37,28 @@ private int minInstanceCount = 0; private long minTotalSize = 0; + private ObjectFilter objectFilter = NoObjectFilter.INSTANCE; private final TreeMap<String, HeapCounter> countData = new TreeMap<String, HeapCounter>(); private static final char newline = '\n'; public boolean contains(String classname) { - return countData.containsKey(classname); + // If we don't accept this class, we pretend to have it already to (maybe) avoid unnecessary work + // and memory allocation (we also hope to avoid a call to add(String, int)). + return !objectFilter.accept(classname) || countData.containsKey(classname); } public void add(String className, int size) { - HeapCounter count = (HeapCounter) countData.get(className); - - if (count == null) { - count = new HeapCounter(className, size); - countData.put(className, count); - } - - count.inc(); - - count = null; + if (objectFilter.accept(className)) { + HeapCounter count = (HeapCounter) countData.get(className); + + if (count == null) { + count = new HeapCounter(className, size); + countData.put(className, count); + } + + count.inc(); + } } /** @@ -75,22 +80,34 @@ public void setMinimumTotalSize(long bytes) { this.minTotalSize = bytes; } - + /** * {@inheritDoc} + */ + @Override + public void setObjectFilter(ObjectFilter objectFilter) { + this.objectFilter = (objectFilter == null) ? NoObjectFilter.INSTANCE : objectFilter; + } + + /** + * {@inheritDoc} * @throws IOException */ public void writeTo(Appendable a) throws IOException { boolean first = true; - for (HeapCounter c : countData.values()) { - if ((c.getInstanceCount() >= minInstanceCount) && (c.getTotalSize() >= minTotalSize)) { - if (first) { - first = false; - } else { - a.append(newline); + if (countData.isEmpty()) { + a.append("No object is matching criteria"); + } else { + for (HeapCounter c : countData.values()) { + if ((c.getInstanceCount() >= minInstanceCount) && (c.getTotalSize() >= minTotalSize)) { + if (first) { + first = false; + } else { + a.append(newline); + } + c.append(a); } - c.append(a); } } a.append(newline); Modified: trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java =================================================================== --- trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/core/src/core/org/jnode/vm/memmgr/def/DefaultHeapManager.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -35,6 +35,7 @@ import org.jnode.vm.classmgr.VmType; import org.jnode.vm.facade.GCStatistics; import org.jnode.vm.facade.HeapStatistics; +import org.jnode.vm.facade.ObjectFilter; import org.jnode.vm.facade.ObjectVisitor; import org.jnode.vm.facade.VmProcessor; import org.jnode.vm.memmgr.HeapHelper; @@ -447,8 +448,12 @@ return gcManager.getStatistics(); } - public HeapStatistics getHeapStatistics() { + /** + * {@inheritDoc} + */ + public HeapStatistics getHeapStatistics(ObjectFilter objectFilter) { final DefHeapStatistics heapStatistics = new DefHeapStatistics(); + heapStatistics.setObjectFilter(objectFilter); final HeapStatisticsVisitor heapStatisticsVisitor = new HeapStatisticsVisitor( heapStatistics); Modified: trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java =================================================================== --- trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java 2011-08-24 18:26:16 UTC (rev 5860) +++ trunk/core/src/mmtk-vm/org/jnode/vm/memmgr/mmtk/BaseMmtkHeapManager.java 2011-08-24 18:27:24 UTC (rev 5861) @@ -40,6 +40,7 @@ import org.jnode.vm.classmgr.VmNormalClass; import org.jnode.vm.classmgr.VmType; import org.jnode.vm.facade.HeapStatistics; +import org.jnode.vm.facade.ObjectFilter; import org.jnode.vm.facade.VmArchitecture; import org.jnode.vm.facade.VmProcessor; import org.jnode.vm.facade.VmUtils; @@ -179,7 +180,10 @@ return BasePlan.freeMemory().toLong(); } - public HeapStatistics getHeapStatistics() { + /** + * {@inheritDoc} + */ + public HeapStatistics getHeapStatistics(ObjectFilter objectFilter) { return null; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ EMC VNX: the world's simplest storage, starting under $10K The only unified storage solution that offers unified management Up to 160% more powerful than alternatives and 25% more efficient. Guaranteed. http://p.sf.net/sfu/emc-vnx-dev2dev _______________________________________________ Jnode-svn-commits mailing list Jnode-svn-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jnode-svn-commits