JVM涉及,
1)编译器线程在运行时将字节代码编译为本机代码。
2)链接阶段,类似于将.o文件链接到可执行文件(如C)
编译和动态链接是,而不是最初启动之后的一次作业。这是在生产上运行的可执行文件生命周期的一部分。
为什么java编译器被设计成生成独立于平台的代码(字节码)?这将性能滞后转移到java运行时,在每台生产机器上编译字节代码和链接功能。
难道我们不是在每台客户拥有的生产机器上使用额外的cpu周期在运行时处理(编译/链接)吗?客户不需要知道编译一次,并在任何地方运行,这在2-3构建机器中是可以避免的,以构建平台特定的二进制文件。
发布于 2017-09-20 11:54:42
编辑:下面是对最初问题的回答,解释为“如何才能最大限度地减少及时编译对Java虚拟机的影响?”
仅使用解释器
如果您想完全禁用编译,可以使用java的-Xint参数,但我认为这将导致几乎所有情况下的性能显著下降。
减少JIT编译器线程优先级
您可以使用-XX:CompilerThreadPriority=<n>降低JIT编译器线程的优先级。您可以在那里使用的值与操作系统有关。
减少JIT编译器线程的数量
如果您关注JIT编译器线程的数量,可以使用-XX:CICompilerCount=<n>和-XX:[+|-]CICompilerCountPerCPU标志来控制编译器线程的数量。
CICompilerCountPerCPU是true (-XX:+CICompilerCountPerCPU),HotSpot将使用一些公式来决定应该启动多少个编译器线程(~ (log * log )*3/2,其中n=#可用CPU)。CICompilerCount,HotSpot将使用那么多的编译器线程。如果没有设置任何内容,CICompilerCountPerCPU将自动设置为true。
调整编译策略
您可以增加编译阈值,以便更少的方法被编译。如果您使用的是累编译(现在默认),则可以使用
-XX:Tier3CompileThreshold=<n> (默认为2000年)-XX:Tier3InvocationThreshold=<n> (默认为200)-XX:Tier4CompileThreshold=<n> (默认为15000)-XX:Tier4InvocationThreshold=<n> (默认为5000)分层编译策略还有许多其他的诀窍。特别是,您也只能在-XX:TieredStopAtLevel=<n>中使用某些层,其中n在1和4之间。较高的层通常提供更好的性能,但需要更长的编译时间。
发布于 2017-09-20 20:40:45
Java之所以不生成特定于平台的可执行文件,是因为可移植性。Java的重点是“写一次,在任何地方运行”。我们应该能够在windows计算机上编写java程序,在Linux上编译它,并在Mac上运行它,没有任何问题。为目标平台编写JVM的人是负责将JVM移植到新平台的人,而不是您。
但是JVM确实擅长优化,并且可以将大量使用的代码从字节代码转换为特定于平台的本地代码。只有在需要的情况下,如果它能提高性能,它才会这样做。就像优化编译器一样,JVM知道得最好,除非您有一个特定于的用例,否则不会破坏它的功能。
https://stackoverflow.com/questions/46291995
复制相似问题