我有一个带有private static final字段的类,不幸的是,我需要在运行时更改.
使用反射我得到这个错误: java.lang.IllegalAccessException: Can not set static final boolean field
有没有办法改变价值?
Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");
hack.setAccessible(true);
hack.set(null, true);
Run Code Online (Sandbox Code Playgroud) 问题
我有一段java代码(相关的JDK 1.6.0._22),它实现了无状态,无副作用的自由函数,没有互斥体.然而它确实使用了大量内存(我不知道这是否相关).
在过去,我访问过Sun Laboratories并收集了标准的"性能与线程数"曲线.由于此函数没有互斥锁,因此它有一个很好的图形,尽管随着线程数量的增加垃圾收集也开始了.经过一些垃圾收集调整后,我能够使这条曲线几乎平坦.
我现在在英特尔硬件上做同样的实验.硬件有4个CPU,每个CPU有8个内核和超线程.这给出了64个availableProcessors().不幸的是,"性能与线程数"的曲线很好地适用于1,2,3线程和3线程的大写.在3个线程之后,我可以根据需要添加任意数量的线程,并且性能不会更好
尝试解决问题
我的第一个想法是我曾经愚蠢并在某处引入了一些同步代码.通常要解决此问题,我运行JConsole或JVisualVM,并查看线程堆栈跟踪.如果我有64个线程以3的速度运行,我预计其中有61个会等待进入互斥锁.我没有找到这个.相反,我发现所有线程都在运行:非常慢.
第二个想法是,时间框架可能引入了问题.我用一个虚拟函数替换了我的函数,使用AtomicLong计算到十亿.这与线程数量相当精确:使用64个线程比使用1个线程,我能够快速计算到10亿次,高出64倍.
我认为(绝望开始)也许垃圾收集花了很长时间,所以我调整了垃圾收集参数.虽然这改善了我的延迟变化,但它对吞吐量没有影响:我仍然有64个线程以我期望3运行的速度运行.
我已经下载了英特尔工具VTunes,但我的技巧很弱:它是一个复杂的工具,我还不明白.我订购了说明书:给自己一个有趣的圣诞礼物,但是现在有点太晚了,无法解决我当前的问题
题