为什么Java与其他解释语言相比具有更好的性能?

时间:2013-06-10 20:37:12

标签: java performance jvm interpreter

与其他解释性语言(如Python)相比,为什么Java具有更好的性能?我知道这可能与它事先编译的事实有关,但是并发性呢?

JVM如何能够在并发程序中更好地执行,而解释语言必须处理诸如全局解释器锁定之类的事情,这会让事情变得更慢?

2 个答案:

答案 0 :(得分:11)

这是一个非常有趣的问题,但我不确定是否有一个简单的方法来回答它。如今,JVM使用一系列高度激进的优化来尝试提高性能。以下是一些:

  • 动态编译:大多数优秀的JVM可以将字节码直接动态编译为机器代码,然后以本机速度执行。
  • 多态内联缓存:许多JVM使用inline caching尝试通过记住过去调用过哪些函数来提高方法调度的性能。
  • 静态类型:由于Java是静态类型的,因此字节码指令很少需要对对象类型进行昂贵的内省,以确定如何对其执行操作。可以静态地计算字段偏移,并且也可以预先计算虚拟功能表中的方法索引。将此与JavaScript等语言进行对比,这些语言没有静态类型,而且难以解释。
  • 垃圾收集: JVM垃圾收集器已经过优化,可以有效地分配和释放对象。它结合使用标记和扫描以及停止和复制技术,使大多数分配速度非常快,并且可以快速回收大量内存。
  • 已知的阻塞点:一些JVM实现不是拥有巨大的VM锁,而是自动在每段编译/解释代码中插入额外的代码,以定期检入VM并确定它们是否可以保留运行。这样,如果JVM只需要在几个线程中进行垃圾收集,它就可以在其他线程运行时执行。如果它需要执行一个stop-the-world操作,它只会在线程达到特定点时发生,这意味着简单操作不必连续检入VM状态。

我可能不知道有很多很多优化措施,但我希望这可以帮助你找到答案!

答案 1 :(得分:3)

Java代码在编译期间几乎没有优化。

运行时JIT执行大部分编译。

Java的不同之处在于它相对较差且副作用最小。这使代码更容易优化。

  

虽然解释型语言必须处理诸如全局解释器锁定之类的东西,这真的会让事情变慢吗?

这是一个实施问题。 Java从一开始就设计有多线程支持。我怀疑python是为脚本编写和快速开发周期而设计的,结果它做得更好。