java – Oracle Hotspot JVM:一般来说,哪些操作特别是CPU代价高昂?

我想了解哪些类型的操作对CPU负载造成不成比例的影响,以及对常见操作的相对成本有直觉.为了最小化一般化,请假设Oracle 7 HotSpot JVM.

例如:

>构建大量对象会花费CPU(我明白它会花费内存:-))?
>满足于监视器的成本CPU吗?即如果我们有多个线程试图进入同一个同步块,那么被阻塞的线程也会占用CPU周期吗?
>以上业务的相对成本?例如,“新建一个对象的成本与迭代X元素阵列的CPU相同”

有关开发典型操作的相对CPU成本直觉的任何提示吗?

你可以推荐哪些关于这个主题的好读物?

谢谢,

澄清

感谢早期回复,但请注意我:

>我不是在问’为什么我的应用程序很慢’
>了解使用分析器将有助于识别特定应用程序中的问题,例如,GC可能会占用CPU,或者GC的终身产生比Eden space更昂贵
>明白大多数操作只有在执行很多时才会变得昂贵(例如,如果谨慎使用,几乎没有操作费用昂贵)

相反,我正在寻找相对CPU成本的指导,尤其是w.r.t.以上操作(让我们假设一个’web-scale’应用程序使用所有提到等量的操作 – 很多).

例如我现在已经:

> long方法调用链对CPU负载没有显着贡献(因此通常可以自由地使用方法委派)
>抛出异常比使用条件更昂贵(因此后者通常优先用于高性能敏感代码中的流控制)

…但是为显示器实例化新对象或内容呢?这些操作中的任何一个都是重要的(占主导地位的)CPU负载的贡献者(假设我不关心延迟或堆大小)吗?

最佳答案 我认为你之间写的相对CPU消耗如下:

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

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

3)如果对象很复杂并且导致创建子对象,则创建对象可能会很慢;创建一个新的Object()只比线程切换慢一点;但可能是我错了,它是一样的;无论如何可比

4)抛出/捕获异常非常缓慢;它比创建一个对象慢10-100倍

点赞