首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成平台特定的二进制代码

生成平台特定的二进制代码
EN

Stack Overflow用户
提问于 2017-09-19 04:47:12
回答 2查看 890关注 0票数 0

JVM涉及,

1)编译器线程在运行时将字节代码编译为本机代码。

2)链接阶段,类似于将.o文件链接到可执行文件(如C)

编译和动态链接是,而不是最初启动之后的一次作业。这是在生产上运行的可执行文件生命周期的一部分。

为什么java编译器被设计成生成独立于平台的代码(字节码)?这将性能滞后转移到java运行时,在每台生产机器上编译字节代码和链接功能。

难道我们不是在每台客户拥有的生产机器上使用额外的cpu周期在运行时处理(编译/链接)吗?客户不需要知道编译一次,并在任何地方运行,这在2-3构建机器中是可以避免的,以构建平台特定的二进制文件。

EN

回答 2

Stack Overflow用户

发布于 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之间。较高的层通常提供更好的性能,但需要更长的编译时间。

票数 3
EN

Stack Overflow用户

发布于 2017-09-20 20:40:45

Java之所以不生成特定于平台的可执行文件,是因为可移植性。Java的重点是“写一次,在任何地方运行”。我们应该能够在windows计算机上编写java程序,在Linux上编译它,并在Mac上运行它,没有任何问题。为目标平台编写JVM的人是负责将JVM移植到新平台的人,而不是您。

但是JVM确实擅长优化,并且可以将大量使用的代码从字节代码转换为特定于平台的本地代码。只有在需要的情况下,如果它能提高性能,它才会这样做。就像优化编译器一样,JVM知道得最好,除非您有一个特定于用例,否则不会破坏它的功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46291995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档