Oracle Hotspot JVM:通常,哪些操作特别是CPU



我想了解哪些类型的操作对CPU负载造成了不成比例的贡献,并开发了对共同操作的相对成本的直觉。为了最大程度地减少概括,请假设Oracle 7 Hotspot JVM。

例如:

  • 构建许多对象是否会花费CPU(我知道它会花费内存:-))?
  • 满足监视器的内容是否成本CPU?即,如果我们有多个线程试图进入相同的同步块,那么封锁线程是否也会消耗CPU周期?
  • 上述操作的相对成本?例如,"新'单个对象的成本与X元素数组迭代相同的CPU"

关于开发典型操作相对CPU成本的直觉的任何技巧?

关于您可以推荐的主题有什么好读物?

谢谢,

澄清

感谢您的早期答复,但请注意我:

  • 不是问"为什么我的应用程序慢"
  • 了解,使用探查器将有助于确定特定应用程序中的问题,例如,GC可以吃掉CPU或GC的终身代表比Eden Space
  • 更为昂贵。
  • 了解大多数OP仅在执行很多时才成本高昂(即,如果使用少量使用,几乎没有OP昂贵)

相反,我正在寻找相对CPU成本的指导,尤其是W.R.T.上面的操作(让我们假设一个" Web尺度"应用程序使用所有提到的所有操作量相同的数量 - 很多)。

例如,我现在已经是:

  • 长方法呼叫链没有对CPU负载做出重大贡献(因此通常可以自由地使用方法委托)
  • 投掷异常比使用条件更昂贵(因此,在高度性能敏感的代码中通常首选流量控制)

...但是如何实例化新对象或显示监视器的内容?这些操作中的任何一个都重要(主导?)CPU负载的贡献者(假设我不在乎延迟或堆大小)?

单个操作总是很快。可衡量的CPU负载执行了数千次甚至一百万或亿次。因此,您想提防各种循环和重新递归电话。

通常,很明显,由于明显的循环仅执行了一百次,因此执行了一百万次。但是,它调用了执行一百次的功能,其中包含另一个执行操作的另一个功能。这样一来,您最终会运行一百万次。在Web应用中,它乘以并发请求的数量。

由于发现真正的热点并不容易,因此您可能想使用特殊的性能分析工具来调查您的应用程序。这样,您就会了解哪些模式是CPU密集型的,哪些模式不是。

Java中的另一件事,如果您分配了很多无法快速释放的内存(是很少的大块和许多小块),那么垃圾收集就可以成为CPU猪。使用大量的字符串(例如,处理XML时)可能是这样的原因。

,但最好的是使用工具进行分析。

我认为您在您中写下了相对CPU的消耗:

1)数组的索引;它很快;只是解决

2)监视器 - 较慢;悬挂和等待的线程不会消耗CPU,切换的消耗很少,但不仅仅是索引

3)如果对象很复杂并导致子对象创建,则创建对象可能会很慢;创建单个new Object()的速度比线程开关略慢;但是我可能是错的,也是一样的。无论如何

4)抛出/抓住例外非常慢;创建对象

慢了10-100倍

投掷例外可能非常便宜。昂贵的部分通常仅是异常对象的创建,因为这调用fillInStackTrace(),这很昂贵。如果省略了这一点,其余的很快(可以像C中的goto一样快)。

来源:https://blogs.oracle.com/jrose/entry/longjumps_considered_inexpengesigand

这是一个有关OpenJDK JVM的内部内容的页面,列出了有关性能的信息以获取更多信息。

最新更新