|
From: <fd...@us...> - 2011-08-24 18:27:31
|
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 <fd...@jn...>
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 (fd...@jn...)
+ *
+ */
+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 (fd...@jn...)
+ *
+ */
+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 (fd...@jn...)
+ *
+ */
+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.
|