/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
import java.util.Map;
import java.lang.ref.*;
import org.visage.runtime.VisageObject;
/**
* This BTrace script tries to measure aggregate stat like total
* VisageObject count, total dependent count, total notification count etc.
* This script measures histogram of VisageObjects as well.
*
* @author A. Sundararajan
*/
@BTrace public class VisageBtraceTracker {
private static Class dependentClass;
private static Class weakBinderRefClass;
// @Property exposes this field as MBean attribute
@Property
private static Map<String, Integer> histo = newHashMap();
/*
* its unfortunate that the btrace/mbean does not refresh the
* hashmap, therefore we get these values and present them via
* mbean individually.
*/
@Property
private static long visageObjectCount = 0;
@Property
private static long visageWeakRefsCount = 0;
@Property
private static long visageDependentCount = 0;
@Property
private static long visageNotifyDependentsCount = 0;
@OnMethod(
clazz="org.visage.runtime.VisageBase",
method="<init>"
)
public static void onNewVisageObject(@Self Object obj, boolean dummy) {
visageObjectCount++;
String cn = name(classOf(obj));
Integer i = get(histo, cn);
if (i == null) {
i = box(1);
} else {
i = box(unbox(i) + 1);
}
put(histo, cn, i);
}
@OnMethod(
clazz="org.visage.runtime.WeakBinderRef",
method="<init>"
)
public static void onNewWeakBinderRef(@Self Object obj, VisageObject referred) {
weakBinderRefClass = probeClass();
visageWeakRefsCount++;
}
@OnMethod(
clazz="org.visage.runtime.Dependent",
method="<init>"
)
public static void onNewDependent(@Self Object obj, VisageObject referred) {
dependentClass = probeClass();
visageWeakRefsCount++;
}
@OnMethod(
clazz="java.lang.ref.Reference",
method="clear"
)
public static void onReferenceClear(@Self Object obj) {
if ((dependentClass != null && isInstance(dependentClass, obj)) ||
(weakBinderRefClass != null && isInstance(weakBinderRefClass, obj))) {
visageWeakRefsCount--;
}
}
@OnMethod(
clazz="org.visage.runtime.VisageBase",
method="addDependent$"
)
public static void onAddDependent(VisageObject obj, int varNum, VisageObject dep) {
visageDependentCount++;
}
@OnMethod(
clazz="org.visage.runtime.VisageBase",
method="removeDependent$"
)
public static void onRemoveDependent(VisageObject obj, int varNum, VisageObject dep) {
visageDependentCount--;
}
@OnMethod(
clazz="org.visage.runtime.VisageBase",
method="notifyDependents$"
)
public static void onNotifyDependents(VisageObject obj, int varNum) {
visageNotifyDependentsCount++;
}
@OnTimer(4000)
public static void print() {
if (size(histo) != 0) {
println("========================");
printNumberMap("VisageBase Histogram", histo);
println("========================");
}
}
}