编程语言
首页 > 编程语言> > Java-JMockit:模拟的api会在一段时间后恢复

Java-JMockit:模拟的api会在一段时间后恢复

作者:互联网

我正在使用JMockit来模拟System.currentMillis().
很少有调用返回模拟时间,但是一段时间后,它将开始返回原始时间.
当我在禁用JIT后运行相同的程序时,它运行得很好.

解决方法:

发生这种情况是因为JVM中的JIT优化器不会检查重新定义的方法(重新定义是通过JVM中的另一个子系统完成的).因此,最终JVM决定优化包含对System.currentTimeMillis()的调用的代码,并内联对本机Java方法的调用,以便它开始直接执行实际的本机方法.此时,优化器应检查currentTimeMillis()当前是否已重新定义,并在重新定义的情况下放弃内联.但是,不幸的是,JDK工程师未能解释这种可能性.

如果确实需要多次调用模拟的System.currentTimeMillis(),则唯一的解决方法确实是使用-Xint运行(这不是一个坏主意,因为它通常会减少测试运行的总执行时间).

标签:java-bytecode-asm,jmockit,jit,java,bytecode
来源: https://codeday.me/bug/20191028/1951795.html