有时我听到人们讨论Java的启动时间。这似乎是一个重要的性能方面。但它到底是什么?它由什么组成?动态类加载导致的类加载时间?或者在只编译JVM中的第一次编译开销?还是其他原因导致Java程序执行初期“缓慢”?那么,第二个问题就是如何衡量Java程序的启动时间?从哪一点到哪一点的持续时间称为启动时间?我不知道我的问题是否以正确的方式提出;如果没有,请告诉我。谢谢! 最佳答案 启动时间没有正式定义。实际上,实际IT中使用的大多数术语都没有正式定义。(或者忽略正式定义。)但粗略地说,就是从应用程序启动到它准备好做一些有用的事情的时间。启动
我有以下代码:privatefinalList>slaves;publicvoidupdateOrdering(){//removesvoidweakreferences//andensuresthatweakreferencesarenotvoided//duringsubsequentsortListunwrapped=unwrap();assertunwrapped.size()==this.slaves.size();//****couldbereimplementedwithoutusingunwrap()****Collections.sort(this.slaves,CM
我正在尝试基于方法结构和分析信息(由JVM提供)构建JIT策略,但我无法手动触发JIT。Thisdocumentation说我可以通过调用java.lang.Compiler.compileClass()来运行JIT,但是方法每次都返回false并且java.lang.Compiler检查的属性(java.compiler)每次我运行JVM时都是空的。我在OpenJDK和OracleJVM1.7上试过,结果都一样。但是当我用观察编译统计数据时$jstat-printcompilation我可以看到JIT成功编译了一些符合条件的方法。如果存在任何方式,我宁愿从Java代码中触发它。我试图
JIT的循环展开策略是什么?或者,如果没有简单的答案,那么有什么方法可以检查循环展开的位置/时间?GNodechild=null;for(inti=0;i基本上,我上面有一段代码具有静态迭代次数(8),当我按原样保留for循环时它会很糟糕。但是当我手动展开循环时,它的效果要好得多。我有兴趣了解JIT是否真的展开了循环,如果没有,那是为什么。 最佳答案 如果JVM展开循环,实际上最好回答printingthegeneratedassembly.请注意,这需要您的代码实际作为热点执行(即JVM认为它值得进行昂贵的优化)。为什么JVM决定
我听说是这种情况,但我找不到权威的在线资源来证实这一点。背景:一位同事喜欢将他的局部变量设为final。他这样做的原因之一是性能。我的观点是Java的HotSpotJustInTime编译器会自动检测不变的局部变量,并使它们成为final,因此我们自己这样做不会性能有任何好处。请注意,我不是询问将局部变量设为final是否是良好的编码习惯,因为已经有很多(离题的)SO问题了.编辑:mrhobo提出了关于优化整数文字字节码的一个很好的观点。我应该给出一个我正在谈论的代码类型的例子,以及我的问题:ObjectdoSomething(Foofoo){if(foo==null){returnn
我正在JVM上做一些性能测试,我想衡量内在函数使用的影响。我想在不进入解释模式的情况下为某些方法禁用内部函数的JIT使用。有没有办法做到这一点?谢谢 最佳答案 使用java-XX:+UnlockDiagnosticVMOptions-XX:DisableIntrinsic=_[,...]例如java-XX:+UnlockDiagnosticVMOptions-XX:DisableIntrinsic=_equals,_hashCode正如@apangin所注意到的,您可以首先使用-XX:+PrintIntrinsics来查看哪些方法实
我的问题如下:Java代码通常会像这样实现泛型集合:publicclassGenericCollection{privateObject[]data;publicGenericCollection(){//Backingarrayisaplainobjectarray.this.data=newObject[10];}@SuppressWarnings("unchecked")publicTget(intindex){//Andwejustcasttoappropriatetypewhenneeded.return(T)this.data[index];}}例如这样使用:for(MyO
受此启发question,我写了测试:publicclassMain{privatestaticfinallongTEST_NUMBERS=5L;privatestaticfinallongITERATION_NUMBER=100000L;privatestaticlongvalue;publicstaticvoidmain(finalString[]args)throwsThrowable{for(inti=0;i这个程序在普通情况下被打印出来:nonEqualsCount=12;//orothernon0value;nonEqualsCount=0;nonEqualsCount=0
我负责维护一个基于JSP的应用程序,该应用程序在IBMWebSphere6.1(IBMJ9JVM)上运行。所有JSP页面都有一个静态包含引用,在这个包含文件中声明了一些静态Java方法。它们包含在所有JSP页面中,以提供对这些实用程序静态方法的“轻松访问”。我知道这是一种非常糟糕的工作方式,我正在努力改变这一点。但是,出于好奇并支持我改变这一点的努力,我想知道JVMJIT编译器如何优化这些“重复的”静态方法。它们是单独优化的,即使具有完全相同的签名?JVMJIT编译器是否“看到”这些方法完全相同并提供“统一的”JIT代码? 最佳答案
当您想从代码中榨取最后一点性能时,您会希望尽可能地利用JIT优化。例如,将方法标记为final以方便方法内联,避免关键位置的多态性等。但是我找不到Java程序员可以用来“提示”JIT编译器以获得更快代码的任何引用或选项列表?我们不应该有一份JIT低延迟性能的“最佳编程”实践列表吗? 最佳答案 编写JIT友好代码的最佳方法是编写直接、简单的代码,因为这是JIT寻找并知道如何优化的内容。没有技巧!此外,不同的JVM具有不同的JIT,因此为了确保您的代码能与所有这些JIT一起正常工作,您不能依赖它们中的任何一个。提高JIT性能的常用方法是