Java HotSpot性能引擎的体系结构(7)

在JIT编译中存在着几个问题。首先,由于编译器是在"用户时间"内运行于执行字节码的机器上,因此它将受到编译速度的严格限制:如果编译速度不是特别快,则用户将会感到在程序的启动或某一部分的明显的延迟。这就不得不采取一种折衷方案,用这种折衷方案将很难进行最好的优化,从而将会大大地降低编译性能。
其次,即使JIT有时间进行全优化,这样的优化对Java编程语言来说,也比对传统语言(如C和C++)的优化效果要差。这有以下几个原因:

  • Java编程语言是动态"安全的",其含义是保证程序不违反语言的语义或直接访问非结构化内存。这就意味着必须经常进行动态类型测试, 例如,当转型时(casting)和向对象数组进行存储时。
  • Java编程语言在"堆(heap)"上对所有对象进行分配,而在C++中,许多对象是在栈(stack)上分配的。这就意味着Java编程语言的对象分配效率比C++的对象分配效率要高得多。除此之外,由于Java编程语言是垃圾回收式的,因而它比C++有更多的不同类型的内存分配开销(包括潜在的垃圾清理 (scavenging)和编写-隔离(write-barrier)开销)。
  • Java编程语言中,大部分方法调用是"虚拟的"(潜在是多态的),这在C++中很少见。这不仅意味着方法调用的性能更重要,而且意味着更难以为方法调用而执行静态编译器优化(特别是象内嵌方法(inlining)那样的全局优化)。大多数传统优化在调用之间是最有效的,而Java编程语言中的减小的调用间距离可大大降低这种优化的效率,这是因为它们使用了较小的代码段的缘故。
  • 基于Java技术的程序由于其强大的动态类装载的能力,因而可"在运行中"发生改变。这就使得它特别难于进行许多类型的全局优化,因为编译器不仅必须能够检测这些优化何时会由于动态装载而无效,而且还必须能够在程序执行过程中解除和/或重做这些优化,且不会以任何形式损坏或影响基于Java技术的程序的执行语义(即使这些优化涉及栈上的活动方法)。

上述问题的结果是使得任何试图获取Java编程语言的先进性能的尝试,都必须寻求一种非传统的解决方案,而不是盲目地应用传统编译器技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值