没有显式调用的方法的Java堆栈帧(调用站点)

问题描述 投票:0回答:1

我有一个关于Java程序执行时出现在堆栈上的方法的问题。我已经检测了代码,以便在方法执行开始时以及方法何时退出时记录(在前后考虑AOP)。我为每个线程创建一个日志。结果大多与预期一致,但有一些微妙的差异。

  1. 遇到反射调用时,不仅会记录java.lang.reflect.Method#invoke,还会显示sun.reflect.DelegatingMethodAccessorImpl#invoke等其他调用。我假设这与StackWalker文档中讨论的隐藏框架有关。
  2. 还有其他的调用,主要是java.lang.ClassLoader.loadClass,还有sun.instrument.InstrumentationImpl.transform(请记住,我检测代码!)。这些是具有堆栈帧的方法,但应用程序类中没有调用站点。

我有两个问题:

  1. 是否有所有方法的列表,或定义将隐藏调用的方法的标准(例如“在以sun.开头的包中的类中定义的所有方法)?
  2. 是否有所有方法的列表,或者定义JVM调用的方法的标准,而在用户代码中没有调用点?

谢谢

java reflection jvm invoke
1个回答
1
投票
  1. sun.reflect.DelegatingMethodAccessorImpl#invoke和朋友没有什么特别之处。这些是在Java代码中具有常规call site的普通Java方法。
  2. 确实,某些Java方法是直接从VM代码调用的。有很多这样的电话,要获得完整的清单并不容易。 在HotSpot源代码中查找JavaCalls::call_virtualJavaCalls::call_staticJavaCalls::call_special等。例如,here是对上述ClassLoader.loadClass的调用。 实际上,任何方法都可以通过这种方式进行强制调用。即使您设法获得完整列表,它也不会非常有用,因为它可能会在任何次要的JDK更新中发生变化。 此外,用户代码和代理库也可以使用JNI调用任何Java方法,并且这些调用也不具有可见的Java调用站点。
© www.soinside.com 2019 - 2024. All rights reserved.