package org.araqne.logdb.hprof;
import java.util.HashMap;
import java.util.Map;
import org.araqne.logdb.QueryCommand;
import org.araqne.logdb.Row;
import org.araqne.logdb.RowPipe;
import edu.tufts.eaftan.hprofparser.handler.RecordHandler;
import edu.tufts.eaftan.hprofparser.parser.HprofParserException;
import edu.tufts.eaftan.hprofparser.parser.datastructures.AllocSite;
import edu.tufts.eaftan.hprofparser.parser.datastructures.CPUSample;
import edu.tufts.eaftan.hprofparser.parser.datastructures.Constant;
import edu.tufts.eaftan.hprofparser.parser.datastructures.InstanceField;
import edu.tufts.eaftan.hprofparser.parser.datastructures.Static;
import edu.tufts.eaftan.hprofparser.parser.datastructures.Type;
import edu.tufts.eaftan.hprofparser.parser.datastructures.Value;
public class JmapRecordHandler implements RecordHandler {
private Map<Long, String> strings = new HashMap<Long, String>();
private Map<Long, String> classNames = new HashMap<Long, String>();
private QueryCommand output;
public JmapRecordHandler(QueryCommand output) {
this.output = output;
}
@Override
public void header(String format, int idSize, long time) {
}
@Override
public void stringInUTF8(long id, String data) {
strings.put(id, data);
}
@Override
public void loadClass(int classSerialNum, long classObjId, int stackTraceSerialNum, long classNameStringId) {
String className = strings.get(classNameStringId);
classNames.put(classObjId, className);
}
@Override
public void unloadClass(int classSerialNum) {
}
@Override
public void stackFrame(long stackFrameId, long methodNameStringId, long methodSigStringId, long sourceFileNameStringId,
int classSerialNum, int location) {
}
@Override
public void stackTrace(int stackTraceSerialNum, int threadSerialNum, int numFrames, long[] stackFrameIds) {
}
@Override
public void allocSites(short bitMaskFlags, float cutoffRatio, int totalLiveBytes, int totalLiveInstances,
long totalBytesAllocated, long totalInstancesAllocated, AllocSite[] sites) {
}
@Override
public void heapSummary(int totalLiveBytes, int totalLiveInstances, long totalBytesAllocated, long totalInstancesAllocated) {
}
@Override
public void startThread(int threadSerialNum, long threadObjectId, int stackTraceSerialNum, long threadNameStringId,
long threadGroupNameId, long threadParentGroupNameId) {
}
@Override
public void endThread(int threadSerialNum) {
}
@Override
public void heapDump() {
}
@Override
public void heapDumpEnd() {
}
@Override
public void heapDumpSegment() {
}
@Override
public void cpuSamples(int totalNumOfSamples, CPUSample[] samples) {
}
@Override
public void controlSettings(int bitMaskFlags, short stackTraceDepth) {
}
@Override
public void rootUnknown(long objId) {
}
@Override
public void rootJNIGlobal(long objId, long JNIGlobalRefId) {
}
@Override
public void rootJNILocal(long objId, int threadSerialNum, int frameNum) {
}
@Override
public void rootJavaFrame(long objId, int threadSerialNum, int frameNum) {
}
@Override
public void rootNativeStack(long objId, int threadSerialNum) {
}
@Override
public void rootStickyClass(long objId) {
}
@Override
public void rootThreadBlock(long objId, int threadSerialNum) {
}
@Override
public void rootMonitorUsed(long objId) {
}
@Override
public void rootThreadObj(long objId, int threadSerialNum, int stackTraceSerialNum) {
}
@Override
public void classDump(long classObjId, int stackTraceSerialNum, long superClassObjId, long classLoaderObjId,
long signersObjId, long protectionDomainObjId, long reserved1, long reserved2, int instanceSize,
Constant[] constants, Static[] statics, InstanceField[] instanceFields) {
}
@Override
public void instanceDump(long objId, int stackTraceSerialNum, long classObjId, Value<?>[] instanceFieldValues) {
long bytes = 0;
for (Value<?> v : instanceFieldValues)
bytes += v.type.sizeInBytes();
String className = classNames.get(classObjId);
Row row = new Row();
row.put("obj_id", objId);
row.put("class", className);
row.put("bytes", bytes);
output.onPush(row);
}
@Override
public void objArrayDump(long objId, int stackTraceSerialNum, long elemClassObjId, long[] elems) {
String className = classNames.get(elemClassObjId);
Row row = new Row();
row.put("obj_id", objId);
row.put("class", className);
row.put("bytes", 8 * elems.length);
output.onPush(row);
}
@Override
public void primArrayDump(long objId, int stackTraceSerialNum, byte elemType, Value<?>[] elems) {
Type type = Type.hprofTypeToEnum(elemType);
String typeName = null;
switch (elemType) {
case 2:
typeName = "Object[]";
break;
case 4:
typeName = "boolean[]";
break;
case 5:
typeName = "char[]";
break;
case 6:
typeName = "float[]";
break;
case 7:
typeName = "double[]";
break;
case 8:
typeName = "byte[]";
break;
case 9:
typeName = "short[]";
break;
case 10:
typeName = "int[]";
break;
case 11:
typeName = "long[]";
break;
default:
return;
}
int length = elems != null ? elems.length : 0;
Row row = new Row();
row.put("obj_id", objId);
row.put("class", typeName);
row.put("bytes", length * type.sizeInBytes());
output.onPush(row);
}
@Override
public void finished() {
}
}