gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:00:24 28 4
gpt4 key购买 nike

我有一个关于 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 调用而无需用户代码中的调用点的方法的标准?

谢谢

最佳答案

  1. sun.reflect.DelegatingMethodAccessorImpl#invoke 没什么特别的。和 friend 。这些是普通的 Java 方法,具有常规 call site在 Java 代码中。

  2. 确实有些 Java 方法是直接从 VM 代码调用的。这样的调用有很多,要获得完整的列表并不容易。

    寻找JavaCalls::call_virtual , JavaCalls::call_static , JavaCalls::call_special HotSpot源代码中等。例如,here是对提到的 ClassLoader.loadClass 的调用.

    实际上,任何方法都可以通过这种方式调用。即使您设法获得完整列表,它也不会很有用,因为它可能会在任何次要的 JDK 更新中发生变化。

    此外,用户代码和代理库还可以使用 JNI 调用任何 Java 方法,并且这些调用也不会有可见的 Java 调用站点。

关于没有显式调用的方法的 Java 堆栈框架(调用站点),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55674517/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com