Capturing the first invocation of a method

Harry Yale harryyale at gmail.com
Tue Jan 8 13:51:08 PST 2008


Hi Volker,

It sure would help in another context. But I need to capture first
invocations of methods
on-the-fly internally in the VM code rather than externally from the
debugger or after-the-fast in the log.
Sorry about that if my intention wasn't clear.

Thanks,
Harry

On Jan 8, 2008 1:48 AM, Volker Simonis <volker.simonis at gmail.com> wrote:
> Hi Harry,
>
> you can use the option "-XX:+TraceBytecodes" which is however
> available in a debug build only. This will you give on output as
> follows:
>
> [5158714] static void java.lang.Object.<clinit>()
> [5158714]        1     0  invokestatic 9 <registerNatives> <()V>
> [5158714]        2     3  return
>
> [5158714] static void java.lang.String.<clinit>()
> [5158714]        3     0  iconst_0
> [5158714]        4     1  anewarray java/io/ObjectStreamField
> [5158714]        5     4  putstatic 84
> [5158714]        6     7  new 105
> [5158714]        7    10  dup
> [5158714]        8    11  aconst_null
> [5158714]        9    12  invokespecial 85 <<init>> <(Ljava/lang/String$1;)V>
>
> [5158714] virtual void
> java.lang.String$CaseInsensitiveComparator.<init>(jobject)
> [5158714]       10     0  aload_0
> [5158714]       11     1  invokespecial 0 <<init>> <()V>
>
> Now you can grep the output for the first invocation of the method
> you're interested in. Once you know the bytecodeindex, you can use
> '-XX:TraceBytecodesAt=<BytecodeIndex>' to start the Bytecodetrace at
> the given index or '-XX:StopInterpreterAt=<BytecodeIndex>' to stop at
> the given ByteCode (this only works inside a debugger!).
>
> If you want to stop at the first invocation of a compiled method, you
> can use the '.hotspot_compiler' file or the
> '-XX:CompileCommand=break,class/name.methodName' command line option
> (e.g. '-XX:CompileCommand=break,java/lang/StringBuffer.append' - see
> hotspot/src/share/vm/compiler/CompilerOracle.cpp for more details.)
>
> Hope this helps,
> Volker
>
>
> On 1/8/08, Harry Yale <harryyale at gmail.com> wrote:
> > Hi,
> >
> > How can I capture the moment of the very first invocation of every Java
> > method?
> >
> > I have tried the following approach:
> >
> >
> > In InterpreterGenerator::generate_counter_incr(), I look
> > for the counter value 1 (actually 8 (1 << 3) because the lowest 3 bits are
> > used for other purposes)
> > and if so jump to a function in InterpreterRuntime (like
> > InterpreterRuntime::frequency_counter_overflow()) which
> > prints the name of the method.
> >
> > but I haven't been able to see the first invocation of non-native Java
> > methods. Non-native Java methods seem to have a much larger counter value by
> > the time I capture them in the above function.
> >
> > Am I missing another invocation path or is there a better approach?
> >
> > Thanks.
> >
> >
>



More information about the hotspot-dev mailing list