时间:2025-06-19 21:02
人气:
作者:admin
方法内联能够触发更多的优化。通常而言,内联越多,生成代码的执行效率越高。然而,对于即时编译器来说,内联越多,编译时间也就越长,而程序达到峰值性能的时刻也将被推迟。
内联意味着有编译,编译后的机器码要存到 Codecache 中,而 Codecache 内存是有固定大小的由 Java 虚拟机参数 -XX:ReservedCodeCacheSize 控制),如果 Codecache 满了,则会带来性能问题
通过判断虚方法的目标是否唯一
直接内联
向代码中增添类型比较,内联不同类型目标的虚方法
将虚方法调用转换为一个个的类型测试以及对应该类型的直接调用
一种确定指针动态范围的静态分析,它可以分析在程序的哪些地方可以访问到指针
判断对象是否会被外部方法引用或线程共享
class Foo {
int a = 0;
}
static int bar(int x) { static int bar (int x){
Foo foo = new Foo(); int a = x;
foo.a = x; return a;
return foo.a; }
}
同步消除:如果对象不被多个线程共享消除不必要的同步操作 synchronized (new Object()) {}
以提高性能
Graal中存在此优化(C2中无)
public static void bar(boolean cond) {
Object foo = new Object();
if (cond) {
foo.hashCode();
}
}
// 优化后代码类似:
public static void bar(boolean cond) {
if (cond) {
Object foo = new Object();
foo.hashCode();
}
}
部分逃逸分析通过考虑程序的控制流,能够在对象仅在部分路径中逃逸时进行优化,将对象的创建推迟到必要的分支中执行
由于普通寄存器只有32b 8字节,影响对数组向量的优化 故引入了XMM寄存器

c[i:i+3] = b[i:i+3]+c[i:i+3]

package java.lang;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
具体来说,它们之间的继承关系是MyBenchmark_jmhType -> B3 -> B2 -> B1 -> MyBenchmark(这里A -> B代表 A 继承 B)。其中,B2 存放着 JMH 用来控制基准测试的各项字段。
为了避免这些控制字段对MyBenchmark类中的字段造成 false sharing 的影响,JMH 生成了 B1 和 B3,分别存放了 256 个 Boolean 字段,从而避免 B2 中的字段与MyBenchmark类、MyBenchmark_jmhType类中的字段(或内存里下一个对象中的字段)会出现在同一缓存行中。
@Fork允许开发人员指定所要 Fork 出的 Java 虚拟机的数目。@BenchmarkMode允许指定性能数据的格式。@Warmup和@Measurement允许配置预热迭代或者测试迭代的数目,每个迭代的时间以及每个操作包含多少次对测试方法的调用。@State允许配置测试程序的状态。测试前对程序状态的初始化以及测试后对程序状态的恢复或者校验可分别通过@Setup和@TearDown来实现。// foo.c
#include <stdio.h>
#include "org_example_Foo.h"
JNIEXPORT void JNICALL Java_org_example_Foo_bar__Ljava_lang_String_2Ljava_lang_Object_2
(JNIEnv *env, jobject thisObject, jstring str, jobject obj) {
printf("Hello, World\n");
return;
}
