首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle Hotspot JVM:一般来说,哪些操作特别昂贵?

Oracle Hotspot JVM:一般来说,哪些操作特别昂贵?
EN

Stack Overflow用户
提问于 2012-10-19 18:10:37
回答 3查看 541关注 0票数 4

我想了解哪些类型的操作不成比例地增加CPU负载,并对常见操作的相对成本形成直觉。若要尽量减少泛化,请假定Oracle7JVm。

例如:

  • 构建许多对象是否需要CPU (我知道它需要内存:- )?
  • 监视器的内容是否会花费CPU?如果我们有多个线程试图进入同一个同步块,阻塞的线程是否也会消耗CPU周期?
  • 上述操作的相对成本?例如,“新建单个对象与遍历X元素数组所花费的CPU相同”。

对于开发典型操作相对CPU成本的直觉,有什么建议吗?

关于这个问题,你有什么好的建议吗?

谢谢,

澄清

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

  • 我不是在问“为什么我的应用程序慢”
  • 请理解使用分析器将有助于识别特定应用程序中的问题,例如,GC可能占用CPU,或者GC的终身代比Eden空间更昂贵。
  • 要明白大多数操作只有在大量执行时才会变得昂贵(实际上没有op是昂贵的,如果少用的话)。

相反,我正在寻找相对CPU成本的指导,特别是w.r.t。上面的操作(让我们假设一个‘网络规模’应用程序使用所有操作提到的等量-很多)。

例如,我现在已经知道:

  • 长方法调用链对CPU负载的贡献不大(因此,通常可以自由地使用方法委托)
  • 抛出异常比使用条件更为昂贵(因此,在性能敏感的代码中,通常倾向于使用条件控制)。

...but如何实例化新对象或监视器的内容?这两个行动中的任何一个都是重要的(占主导地位)吗?CPU负载的贡献者(假设我不关心延迟或堆大小)在规模上?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-19 19:16:02

我认为你们中的相对CPU消耗如下:

1)数组的索引;它速度快;它只是寻址

2)监视器--速度较慢;挂起和等待的线程不消耗CPU,切换占用的CPU很少,但比索引更多。

3)如果一个对象是复杂的,并导致子对象的创建,那么创建一个对象可能是缓慢的;创建一个new Object()可能比线程切换稍微慢一点;但是,我可能错了,而且它是相同的;无论如何,是可比的。

4)抛出/捕获异常非常慢;创建对象要慢10到100倍。

票数 1
EN

Stack Overflow用户

发布于 2012-10-19 18:44:17

一次手术总是快的。一个可测量的CPU负载--一项操作被执行了几千次,甚至是一百万次或十亿次。因此,您需要注意各种循环调用和大量递归调用。

通常,并不是很明显某件事情被执行了一百万次,因为显而易见的循环只执行了一百次。但是它调用一个函数,该函数执行某项操作100次,其中包含执行一个操作100次的另一个函数。那样的话,你就会有一些东西被运行了上百万次。在一个web应用程序中,它与并发请求的数量相乘。

由于发现真正的热点并不容易,所以您可能希望使用Java的特殊性能分析工具来研究您的应用程序。通过这种方式,您可以了解哪些模式是CPU密集型的,哪些模式不是。

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-03-04 11:17:40

抛出一个异常是非常便宜的。昂贵的部分通常只是创建异常对象,因为这调用了fillInStackTrace(),这很昂贵。如果您忽略了这一点,其余的将是快速的(它可以与C中的goto一样快)。

来源:价廉

下面是一个页面中包含有关OpenJDK JVM的内部信息,其中列出了有关性能的信息。以获取更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12980029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档