Well for 1.2, 1.3, 1.4 _and_ 1.5 there is the jvmpi that you can use for memory profiling.
JVMTI is supposed to be better, but I am not sure I agree, but then I have not had time to study it. I do know jvmpi quite well though (writing a profiler makes that to one).
jvmpi is supposed to be in 1.5 and dissapear in 1.6, but I guess that 1.6 is quite a long time away.
JVMTI doesn't support object allocation profiling (more precisely, the JVM doesn't generate "object allocation" events) because it was found over time that supporting these events in a highly optimized JVM is a big problem, and the job is better done using what's called bytecode instrumentation. That means that the tool injects some addtional bytecodes into, say, every constructor or before each "new" bytecode instruction in your application, to collect data on allocated objects. Actually, I believe, many profilers were doing it in this way even before JVMTI. This is in many ways better than VM-generated events, since, for one thing, it allows you to profile only a subset of classes and thus reduce the overhead, etc.
You shouldn't need to build it for Solaris, Windows or Linux, just use the shared library.
The basic idea with java_crw_demo was to provide a simple library that could do BCI for you, and providing the source was more of a form of documentation, but having said that, it's use of jvm.h and opcodes.h completely slipped my mind.
You could probably create your own opcodes.h, opcodes.length, and I only used the class file constants
(names starting with JVM_* in the source) from jvm.h, all of these values are documented in the Java Virtual machine Specifcation. I'll investigate why these files, and in general native #include files, that describe the Classfile format aren't officially shipped, people should not have to re-create these lists all the time. Sorry about that.
Hi,
I am also trying to build java_crw_demo and have found the jvm.h, jvm_md.h and opcodes.h in an older jdk (1.3) old-include directory. However I can not locate an opcodes.length file which is also needed. It seems the file I require can be created from the JVM spec. I have no idea how to create an opcodes.h file. Can anyone either instruct me how to go about creating one or let me know where I can find one?
Thanks.
Here is what is needed in java_crw_demo, all part of the Java Classfile specification.
Hope this helps.
-kto
/* Flags */
#define JVM_ACC_PUBLIC0x0001
#define JVM_ACC_PRIVATE0x0002
#define JVM_ACC_PROTECTED0x0004
#define JVM_ACC_STATIC0x0008
#define JVM_ACC_FINAL 0x0010
#define JVM_ACC_SYNCHRONIZED 0x0020
#define JVM_ACC_SUPER 0x0020
#define JVM_ACC_VOLATILE0x0040
#define JVM_ACC_TRANSIENT0x0080
#define JVM_ACC_VARARGS0x0080
#define JVM_ACC_NATIVE0x0100
#define JVM_ACC_INTERFACE0x0200
#define JVM_ACC_ABSTRACT0x0400
#define JVM_ACC_STRICT0x0800
#define JVM_ACC_SYNTHETIC0x1000
#define JVM_ACC_ANNOTATION0x2000
#define JVM_ACC_ENUM 0x4000
enum {
JVM_CONSTANT_Utf8 = 1,
JVM_CONSTANT_Unicode= 2, /* unused */
JVM_CONSTANT_Integer= 3,
JVM_CONSTANT_Float= 4,
JVM_CONSTANT_Long= 5,
JVM_CONSTANT_Double= 6,
JVM_CONSTANT_Class= 7,
JVM_CONSTANT_String= 8,
JVM_CONSTANT_Fieldref= 9,
JVM_CONSTANT_Methodref= 10,
JVM_CONSTANT_InterfaceMethodref= 11,
JVM_CONSTANT_NameAndType= 12
};
/* Type signatures */
#define JVM_SIGNATURE_ARRAY'['
#define JVM_SIGNATURE_BYTE'B'
#define JVM_SIGNATURE_CHAR'C'
#define JVM_SIGNATURE_CLASS'L'
#define JVM_SIGNATURE_ENDCLASS';'
#define JVM_SIGNATURE_ENUM'E'
#define JVM_SIGNATURE_FLOAT'F'
#define JVM_SIGNATURE_DOUBLE 'D'
#define JVM_SIGNATURE_FUNC'('
#define JVM_SIGNATURE_ENDFUNC')'
#define JVM_SIGNATURE_INT'I'
#define JVM_SIGNATURE_LONG'J'
#define JVM_SIGNATURE_SHORT'S'
#define JVM_SIGNATURE_VOID'V'
#define JVM_SIGNATURE_BOOLEAN'Z'
/* Opcodes */
enum {
opc_nop = 0,
opc_aconst_null = 1,
opc_iconst_m1 = 2,
opc_iconst_0 = 3,
opc_iconst_1 = 4,
opc_iconst_2 = 5,
opc_iconst_3 = 6,
opc_iconst_4 = 7,
opc_iconst_5 = 8,
opc_lconst_0 = 9,
opc_lconst_1 = 10,
opc_fconst_0 = 11,
opc_fconst_1 = 12,
opc_fconst_2 = 13,
opc_dconst_0 = 14,
opc_dconst_1 = 15,
opc_bipush = 16,
opc_sipush = 17,
opc_ldc = 18,
opc_ldc_w = 19,
opc_ldc2_w = 20,
opc_iload = 21,
opc_lload = 22,
opc_fload = 23,
opc_dload = 24,
opc_aload = 25,
opc_iload_0 = 26,
opc_iload_1 = 27,
opc_iload_2 = 28,
opc_iload_3 = 29,
opc_lload_0 = 30,
opc_lload_1 = 31,
opc_lload_2 = 32,
opc_lload_3 = 33,
opc_fload_0 = 34,
opc_fload_1 = 35,
opc_fload_2 = 36,
opc_fload_3 = 37,
opc_dload_0 = 38,
opc_dload_1 = 39,
opc_dload_2 = 40,
opc_dload_3 = 41,
opc_aload_0 = 42,
opc_aload_1 = 43,
opc_aload_2 = 44,
opc_aload_3 = 45,
opc_iaload = 46,
opc_laload = 47,
opc_faload = 48,
opc_daload = 49,
opc_aaload = 50,
opc_baload = 51,
opc_caload = 52,
opc_saload = 53,
opc_istore = 54,
opc_lstore = 55,
opc_fstore = 56,
opc_dstore = 57,
opc_astore = 58,
opc_istore_0 = 59,
opc_istore_1 = 60,
opc_istore_2 = 61,
opc_istore_3 = 62,
opc_lstore_0 = 63,
opc_lstore_1 = 64,
opc_lstore_2 = 65,
opc_lstore_3 = 66,
opc_fstore_0 = 67,
opc_fstore_1 = 68,
opc_fstore_2 = 69,
opc_fstore_3 = 70,
opc_dstore_0 = 71,
opc_dstore_1 = 72,
opc_dstore_2 = 73,
opc_dstore_3 = 74,
opc_astore_0 = 75,
opc_astore_1 = 76,
opc_astore_2 = 77,
opc_astore_3 = 78,
opc_iastore = 79,
opc_lastore = 80,
opc_fastore = 81,
opc_dastore = 82,
opc_aastore = 83,
opc_bastore = 84,
opc_castore = 85,
opc_sastore = 86,
opc_pop = 87,
opc_pop2 = 88,
opc_dup = 89,
opc_dup_x1 = 90,
opc_dup_x2 = 91,
opc_dup2 = 92,
opc_dup2_x1 = 93,
opc_dup2_x2 = 94,
opc_swap = 95,
opc_iadd = 96,
opc_ladd = 97,
opc_fadd = 98,
opc_dadd = 99,
opc_isub = 100,
opc_lsub = 101,
opc_fsub = 102,
opc_dsub = 103,
opc_imul = 104,
opc_lmul = 105,
opc_fmul = 106,
opc_dmul = 107,
opc_idiv = 108,
opc_ldiv = 109,
opc_fdiv = 110,
opc_ddiv = 111,
opc_irem = 112,
opc_lrem = 113,
opc_frem = 114,
opc_drem = 115,
opc_ineg = 116,
opc_lneg = 117,
opc_fneg = 118,
opc_dneg = 119,
opc_ishl = 120,
opc_lshl = 121,
opc_ishr = 122,
opc_lshr = 123,
opc_iushr = 124,
opc_lushr = 125,
opc_iand = 126,
opc_land = 127,
opc_ior = 128,
opc_lor = 129,
opc_ixor = 130,
opc_lxor = 131,
opc_iinc = 132,
opc_i2l = 133,
opc_i2f = 134,
opc_i2d = 135,
opc_l2i = 136,
opc_l2f = 137,
opc_l2d = 138,
opc_f2i = 139,
opc_f2l = 140,
opc_f2d = 141,
opc_d2i = 142,
opc_d2l = 143,
opc_d2f = 144,
opc_i2b = 145,
opc_i2c = 146,
opc_i2s = 147,
opc_lcmp = 148,
opc_fcmpl = 149,
opc_fcmpg = 150,
opc_dcmpl = 151,
opc_dcmpg = 152,
opc_ifeq = 153,
opc_ifne = 154,
opc_iflt = 155,
opc_ifge = 156,
opc_ifgt = 157,
opc_ifle = 158,
opc_if_icmpeq = 159,
opc_if_icmpne = 160,
opc_if_icmplt = 161,
opc_if_icmpge = 162,
opc_if_icmpgt = 163,
opc_if_icmple = 164,
opc_if_acmpeq = 165,
opc_if_acmpne = 166,
opc_goto = 167,
opc_jsr = 168,
opc_ret = 169,
opc_tableswitch = 170,
opc_lookupswitch = 171,
opc_ireturn = 172,
opc_lreturn = 173,
opc_freturn = 174,
opc_dreturn = 175,
opc_areturn = 176,
opc_return = 177,
opc_getstatic = 178,
opc_putstatic = 179,
opc_getfield = 180,
opc_putfield = 181,
opc_invokevirtual = 182,
opc_invokespecial = 183,
opc_invokestatic = 184,
opc_invokeinterface = 185,
opc_xxxunusedxxx = 186,
opc_new = 187,
opc_newarray = 188,
opc_anewarray = 189,
opc_arraylength = 190,
opc_athrow = 191,
opc_checkcast = 192,
opc_instanceof = 193,
opc_monitorenter = 194,
opc_monitorexit = 195,
opc_wide = 196,
opc_multianewarray = 197,
opc_ifnull = 198,
opc_ifnonnull = 199,
opc_goto_w = 200,
opc_jsr_w = 201,
opc_MAX = 201
};
/* Opcode length initializer, use with something like:
*unsigned char opcode_length[opc_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER;
*/
#define JVM_OPCODE_LENGTH_INITIALIZER { \
1,/* nop */\
1,/* aconst_null */\
1,/* iconst_m1 */\
1,/* iconst_0 */\
1,/* iconst_1 */\
1,/* iconst_2 */\
1,/* iconst_3 */\
1,/* iconst_4 */\
1,/* iconst_5 */\
1,/* lconst_0 */\
1,/* lconst_1 */\
1,/* fconst_0 */\
1,/* fconst_1 */\
1,/* fconst_2 */\
1,/* dconst_0 */\
1,/* dconst_1 */\
2,/* bipush */\
3,/* sipush */\
2,/* ldc */\
3,/* ldc_w */\
3,/* ldc2_w */\
2,/* iload */\
2,/* lload */\
2,/* fload */\
2,/* dload */\
2,/* aload */\
1,/* iload_0 */\
1,/* iload_1 */\
1,/* iload_2 */\
1,/* iload_3 */\
1,/* lload_0 */\
1,/* lload_1 */\
1,/* lload_2 */\
1,/* lload_3 */\
1,/* fload_0 */\
1,/* fload_1 */\
1,/* fload_2 */\
1,/* fload_3 */\
1,/* dload_0 */\
1,/* dload_1 */\
1,/* dload_2 */\
1,/* dload_3 */\
1,/* aload_0 */\
1,/* aload_1 */\
1,/* aload_2 */\
1,/* aload_3 */\
1,/* iaload */\
1,/* laload */\
1,/* faload */\
1,/* daload */\
1,/* aaload */\
1,/* baload */\
1,/* caload */\
1,/* saload */\
2,/* istore */\
2,/* lstore */\
2,/* fstore */\
2,/* dstore */\
2,/* astore */\
1,/* istore_0 */\
1,/* istore_1 */\
1,/* istore_2 */\
1,/* istore_3 */\
1,/* lstore_0 */\
1,/* lstore_1 */\
1,/* lstore_2 */\
1,/* lstore_3 */\
1,/* fstore_0 */\
1,/* fstore_1 */\
1,/* fstore_2 */\
1,/* fstore_3 */\
1,/* dstore_0 */\
1,/* dstore_1 */\
1,/* dstore_2 */\
1,/* dstore_3 */\
1,/* astore_0 */\
1,/* astore_1 */\
1,/* astore_2 */\
1,/* astore_3 */\
1,/* iastore */\
1,/* lastore */\
1,/* fastore */\
1,/* dastore */\
1,/* aastore */\
1,/* bastore */\
1,/* castore */\
1,/* sastore */\
1,/* pop */\
1,/* pop2 */\
1,/* dup */\
1,/* dup_x1 */\
1,/* dup_x2 */\
1,/* dup2 */\
1,/* dup2_x1 */\
1,/* dup2_x2 */\
1,/* swap */\
1,/* iadd */\
1,/* ladd */\
1,/* fadd */\
1,/* dadd */\
1,/* isub */\
1,/* lsub */\
1,/* fsub */\
1,/* dsub */\
1,/* imul */\
1,/* lmul */\
1,/* fmul */\
1,/* dmul */\
1,/* idiv */\
1,/* ldiv */\
1,/* fdiv */\
1,/* ddiv */\
1,/* irem */\
1,/* lrem */\
1,/* frem */\
1,/* drem */\
1,/* ineg */\
1,/* lneg */\
1,/* fneg */\
1,/* dneg */\
1,/* ishl */\
1,/* lshl */\
1,/* ishr */\
1,/* lshr */\
1,/* iushr */\
1,/* lushr */\
1,/* iand */\
1,/* land */\
1,/* ior */\
1,/* lor */\
1,/* ixor */\
1,/* lxor */\
3,/* iinc */\
1,/* i2l */\
1,/* i2f */\
1,/* i2d */\
1,/* l2i */\
1,/* l2f */\
1,/* l2d */\
1,/* f2i */\
1,/* f2l */\
1,/* f2d */\
1,/* d2i */\
1,/* d2l */\
1,/* d2f */\
1,/* i2b */\
1,/* i2c */\
1,/* i2s */\
1,/* lcmp */\
1,/* fcmpl */\
1,/* fcmpg */\
1,/* dcmpl */\
1,/* dcmpg */\
3,/* ifeq */\
3,/* ifne */\
3,/* iflt */\
3,/* ifge */\
3,/* ifgt */\
3,/* ifle */\
3,/* if_icmpeq */\
3,/* if_icmpne */\
3,/* if_icmplt */\
3,/* if_icmpge */\
3,/* if_icmpgt */\
3,/* if_icmple */\
3,/* if_acmpeq */\
3,/* if_acmpne */\
3,/* goto */\
3,/* jsr */\
2,/* ret */\
99,/* tableswitch */\
99,/* lookupswitch */\
1,/* ireturn */\
1,/* lreturn */\
1,/* freturn */\
1,/* dreturn */\
1,/* areturn */\
1,/* return */\
3,/* getstatic */\
3,/* putstatic */\
3,/* getfield */\
3,/* putfield */\
3,/* invokevirtual */\
3,/* invokespecial */\
3,/* invokestatic */\
5,/* invokeinterface */\
0,/* xxxunusedxxx */\
3,/* new */\
2,/* newarray */\
3,/* anewarray */\
1,/* arraylength */\
1,/* athrow */\
3,/* checkcast */\
3,/* instanceof */\
1,/* monitorenter */\
1,/* monitorexit */\
0,/* wide */\
4,/* multianewarray */\
3,/* ifnull */\
3,/* ifnonnull */\
5,/* goto_w */\
5/* jsr_w */\
}