Java Flight Recorder 如何采样原生帧 (jni / jna)
How Java Flight Recorder samples native frames (jni / jna)
我试图了解 Java Flight Recorder 如何对使用本机库的应用程序进行采样(在我的例子中是通过 JNA)。
让我们写一个大部分时间在本地的测试用例:
public class Main {
interface MyLib extends Library {
long doStuff(long seed);
}
public static void main(String[] args) {
MyLib myLib = (MyLib) Native.loadLibrary("mylib", MyLib.class);
LongStream.range(0, 10)
.map(myLib::doStuff)
.forEach(System.out::println);
}
}
doStuff 是一个缓慢的、cpu 绑定的函数
int64_t doStuff(int64_t acc) {
for (int i = 0; i < 1<<30; i++) { acc += i; }
return acc;
}
doStuff 在我的机器上执行大约需要 2 秒,而 main 在大约 30 秒内完成。我 运行 这个测试用例与 jdk1.8.0_60 使用以下 JVM 选项:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=jna.jfr
.
当我打开 jna.jfr
时,我看到转储包含一个 单个 堆栈跟踪事件。据我了解,与大多数探查器不同,当本机代码为 运行ning 时,JFR 不会生成堆栈跟踪事件。我完全理解 JFR 不分析本机代码,但我曾期望堆栈跟踪事件是使用位于 java/native 代码边界的堆栈跟踪 t运行 生成的。
我的设置有问题还是预期的行为?我发现它真的很容易出错。如果您不仔细验证样本数,很容易认为热点在 Java 代码中,而大部分时间都花在本机代码中。
也不可能知道最昂贵的本机调用在哪里,这就是您首先使用探查器的原因:)
Flight Recorder 采样器仅在 Java 时发出事件。如果采样器命中本机代码,则可以查看最后一个 Java 帧,但这不是它的实现方式。
我试图了解 Java Flight Recorder 如何对使用本机库的应用程序进行采样(在我的例子中是通过 JNA)。
让我们写一个大部分时间在本地的测试用例:
public class Main {
interface MyLib extends Library {
long doStuff(long seed);
}
public static void main(String[] args) {
MyLib myLib = (MyLib) Native.loadLibrary("mylib", MyLib.class);
LongStream.range(0, 10)
.map(myLib::doStuff)
.forEach(System.out::println);
}
}
doStuff 是一个缓慢的、cpu 绑定的函数
int64_t doStuff(int64_t acc) {
for (int i = 0; i < 1<<30; i++) { acc += i; }
return acc;
}
doStuff 在我的机器上执行大约需要 2 秒,而 main 在大约 30 秒内完成。我 运行 这个测试用例与 jdk1.8.0_60 使用以下 JVM 选项:-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=jna.jfr
.
当我打开 jna.jfr
时,我看到转储包含一个 单个 堆栈跟踪事件。据我了解,与大多数探查器不同,当本机代码为 运行ning 时,JFR 不会生成堆栈跟踪事件。我完全理解 JFR 不分析本机代码,但我曾期望堆栈跟踪事件是使用位于 java/native 代码边界的堆栈跟踪 t运行 生成的。
我的设置有问题还是预期的行为?我发现它真的很容易出错。如果您不仔细验证样本数,很容易认为热点在 Java 代码中,而大部分时间都花在本机代码中。
也不可能知道最昂贵的本机调用在哪里,这就是您首先使用探查器的原因:)
Flight Recorder 采样器仅在 Java 时发出事件。如果采样器命中本机代码,则可以查看最后一个 Java 帧,但这不是它的实现方式。