JVM上最昂贵的操作是什么?

时间:2011-02-01 05:23:33

标签: java jvm

我记得我的教授说new操作是JVM上最昂贵的操作。这是真的?我的意思是,比打开文件更昂贵?我怎么知道Java中任何操作的成本?例如,找出

之间的区别
int a;
Integer b;
Integer c = new Integer(1);
int[] d = new int[10];
Integer[] e = new Integer[10];

8 个答案:

答案 0 :(得分:8)

这是特定于实现的。有可能在现代JVM上,这些都不会带来任何成本。即时编译时,一些JVM会检测到你的对象没有逃脱你的函数范围,并会在堆栈上“免费”分配它们。

您无法真正衡量JVM上最昂贵的操作。如果知道某些东西是昂贵的,那么无论如何,在 Sun Oracle的某个人正在努力降低成本,接下来你知道它将是恒定时间。

在任何编程中唯一被视为昂贵的东西应该是你的算法。

答案 1 :(得分:6)

真的不能说什么是最贵的,但我很确定它不是 new (当然你的构造函数很重,如果有很多东西的话):

HotSpot 1.4.2及更高版本中新Object()的公共代码路径大约是10个机器指令(Sun提供的数据;请参阅参考资料),而C中表现最佳的malloc实现平均需要60个每次调用100条指令(Detlefs,et al。等;请参阅参考资料)。分配性能不是整体性能的一个微不足道的组成部分 - 基准测试表明,许多真实的C和C ++程序,如Perl和Ghostscript,在malloc和free中花费的总执行时间的20%到30% - 远远超过健康的Java应用程序的分配和垃圾收集开销

摘自this文章,请注意它是关于JVM 1.4.2(文章于2005年发布)。从2003年开始的Here's另一个,谈论一些Java性能神话仍在盘旋。而较新的JVM应该比那些时代的版本快得多。

答案 2 :(得分:2)

  

JVM上的高成本操作是什么?

这可能不是一个有意义或可量化的事情:

  • 你还没有说过“操作”是什么。
  • 根据“操作”的含义,“成本”最有可能取决于上下文。例如,一旦JIT编译器对其进行了优化,while (i < 999) i++;可能会有ZERO成本。
  

我记得我的教授说new()操作是JVM上最昂贵的操作。这是真的吗?

可能不是。

  

我的意思是,打开文件?

当然不是。打开文件的过程将创建许多对象。

但是如果你打电话给一个文件打开一个“操作”,那么一个操作有多小或多大?

  

如何知道Java中任何操作的成本?

编写一个隔离和测量给定操作成本的基准是非常困难的。而且它通常也没有意义,因为JVM优化了操作的序列

  

例如,......

之间的区别

即使你的例子很难衡量。例如:

  • 这些陈述的部分成本需要与运行垃圾收集器的成本一起摊销。

  • JIT编译器可能会决定某些或所有这些语句不会影响计算结果,并完全优化它们。

答案 3 :(得分:1)

在JVM实施和目标平台之间,最昂贵的操作可能会有所不同,因此不会得到非常准确的答案。

一些更“昂贵”的操作肯定是文件/套接字I / O和synchronize()。

垃圾收集也相当昂贵(认为这不是您的代码直接调用的操作,编写代码的方式会影响此成本的发生频率)。

答案 4 :(得分:1)

几乎肯定是假的。特别是如果你在谈论将它与“打开一个文件”(肯定不止一个JVM操作)这样的东西进行比较,那么你可以做到最贵的事情。

如果您正在谈论纯粹的墙壁时间,那么套接字read()之类的东西可以按秒的顺序进行测量。如果你想要完成一些工作密集的东西,你可以映射一个原生的ByteByffer,这将需要一个银河时代与new()相比

答案 5 :(得分:1)

打开文件将是操作系统操作,而不是JVM操作。通过操作,您的教练必须意味着Java bytecode instructions。 new()代价很高,因为它需要JVM分配内存并引起连锁反应来初始化对象层次结构。它还可以对GC产生长期影响等。请参阅Java performance tuning

答案 6 :(得分:0)

最昂贵的操作就是

while(true){}

,但为了全面了解成本,您必须使用分析器或基准测试。但要注意,Java中的Microbenchmarks经常会导致错误的结果,因为JVM非常善于优化代码并删除不必要的语句。

答案 7 :(得分:0)

比较昂贵? 你的成本的“货币”是什么? 很多时候,JVM会分摊在多次调用中分析和优化代码的成本,因此情况可能比您想象的要复杂得多。

作为一般指导原则,你可以运行10000次这些东西并测量时间和记忆,以了解事物的相对成本。