我正在寻找一种通过重写字节代码并重新加载类来动态添加字段到线程的方法,不确定它是否完全可能.欢迎任何指示.我发现了一些关于修改和加载类的信息,我知道JRebel可以无缝地交换你的代码,但不确定这里是否适用相同的方法/工具.
这里的动机是探索理论上更好的替代线程本地对象.如果方法有效,我应该能够用注释替换本地线程,结果应该优于当前的JDK实现.
PS:请救我"所有邪恶言论的根源"
澄清用例:
想象一下,我有一个ThreadLocal类:
class A {
ThreadLocal<Counter> counter;
...
counter.get().inc()
}
Run Code Online (Sandbox Code Playgroud)
我想用注释替换它:
class A {
@ThreadLocal
Counter counter;
...
counter.inc()
}
Run Code Online (Sandbox Code Playgroud)
但是代替上面的代码生成我想改变Thread,这样Thread现在有一个Acounter字段,实际的代码将是:
class A {
// Nothing here, field is now in Thread
...
Thread.currentThread().Acounter.inc()
}
Run Code Online (Sandbox Code Playgroud) java classloader dynamic-class-loaders dynamic-class-creation
为了支持更好的分析数据,我希望我的JVMTI代理能够启用几个JVM标志.有问题的代理是Honest-Profiler,它只能在启动时加载.
我想启用标志: -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints
所以这是我试图测试的简单事情,什么是更快的mod操作或AND一个(假设2的幂) - 这就是hashMap内部的作用.这是一个拼写正确的"测试"吗?我不得不承认jmh的内部结构并且在经过所有样本(我认为第3次)之后编写正确的微基准测试是一个相当大的挑战.:)
@State(Scope.Thread)
@BenchmarkMode(org.openjdk.jmh.annotations.Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MeasureSpeedModuleVsAnd {
public static void main(String[] args) throws Exception {
Options opt = new OptionsBuilder()
.include(MeasureSpeedModuleVsAnd.class.getSimpleName())
.forks(1)
.warmupIterations(1)
.measurementIterations(5)
.warmupTime(TimeValue.seconds(2))
.build();
new Runner(opt).run();
}
@Param({ "16", "32", "256", "1048576" /* 2 power of 10 */ })
public int number_of_buckets;
@Param({ "345984", "123456", "111", "98653" })
public int hashcode;
@Benchmark
public int benchamark_modulo() {
return hashcode % number_of_buckets;
}
@Benchmark
public int benchmark_and() {
return (number_of_buckets - 1) & hashcode;
}
}
Run Code Online (Sandbox Code Playgroud)