我想在调试模式下重新发布Java应用程序,以便在客户端随机或难以重现问题时更容易调试.
但是,我想要了解这样做的潜在副作用?从Java HotSpot文档中可以看出,应该没有性能损失.
从链接
全速调试
Java HotSpot VM现在使用全速调试.在以前版本的VM中,启用调试时,程序仅使用解释程序执行.现在,即使使用已编译的代码,HotSpot技术的全部性能优势也可用于程序.性能的提高使得长时间运行的程序更容易调试.它还允许测试以全速进行.一旦出现异常,调试器就会启动代码源的完全可见性.
这是准确的还是有隐藏的警告,内存占用情况如何,使用调试模式时还有其他隐藏的问题.
PS:我发现AMD的这篇文章证实了我最初的怀疑,即oricale的原始文章没有显示完整的故事.
我意识到在调试器中运行时Java代码会变慢.
问题是,通过使用以下选项启动Java,代码是否会变慢:
Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
Run Code Online (Sandbox Code Playgroud)
??
或者只有当您连接到"调试端口"并使用IDE实际执行代码时才会发生减速?
我有这个代码正在测试Calendar.getInstance().getTimeInMillis()
vs System.currentTimeMilli()
:
long before = getTimeInMilli();
for (int i = 0; i < TIMES_TO_ITERATE; i++)
{
long before1 = getTimeInMilli();
doSomeReallyHardWork();
long after1 = getTimeInMilli();
}
long after = getTimeInMilli();
System.out.println(getClass().getSimpleName() + " total is " + (after - before));
Run Code Online (Sandbox Code Playgroud)
我想确保没有JVM或编译器优化发生,因此测试将是有效的并且实际上会显示出差异.
怎么样?
编辑:我改变了代码示例,以便更清楚.我在这里检查的是在不同的实现中调用getTimeInMilli()需要多长时间 - Calendar vs System.