没有合适的资源?快使用搜索试试~ 我知道了~
首页Java JVM分配速度超越C++:性能传言解析
在本文中,作者针对关于Java语言性能的普遍误解进行了深入探讨,特别是关于其与C/C++原始分配性能的比较。许多人认为Java虚拟机(JVM)的分配性能较慢,然而事实并非如此。现代JVM,如HotSpot 1.4.2之后的版本,其newObject()操作通常只需要10条左右的机器指令,相比之下,最优秀的C语言实现的malloc函数调用平均需要60到100条指令。这表明在性能方面,JVM已经取得了显著的进步。 文章指出,分配性能对于整体程序执行的重要性不容忽视,尤其是在处理像Perl和Ghostscript这样的C/C++应用时,它们的malloc和free操作占用了执行时间的20%到30%,远高于健康Java应用在垃圾收集上的开销。这说明动态内存管理,如垃圾收集,虽然可能不如静态内存管理快,但其批量处理方式提供了更多的优化空间,即使牺牲了一部分即时性。 作者提到,早期JVM确实存在分配和垃圾收集性能不佳的问题,这导致了关于“JVM分配慢”的传言。然而,随着时间的推移,如Boehm-Demers-Weiser(BDW)这样的保守垃圾收集器已被证明在某些C++应用程序中通过采用垃圾收集而非传统分配器,实现了性能提升。这表明,随着JVM技术的发展,其分配性能已经达到了一个很高的水平,甚至在某些场景下优于C/C++。 这篇文章强调了对Java性能评价的必要性,以及JVM在分配性能上的改进,并揭示了动态内存管理,尤其是垃圾收集,虽然在某些方面不如静态分配,但在优化和整体性能上具有独特的优势。它提醒我们,对于性能评估,应该基于最新技术和实际情况,而不是停留在过去的刻板印象中。
资源详情
资源推荐
再谈 Urban 性能传言
简介: Java™ 语言遭到许多性能方面的攻击。虽然有些攻击可能是名符其实的,但是看看公告
板和新闻组上关于这一主题的贴子,可以发现,对于 Java 虚拟机(JVM)实际的工作方式存在
许多误解。在本月的 Java
理论与实践
中,Brian Goetz 驳斥了反复重复的有关 JVM 分配慢的
传言。
流行问题:哪种语言的原始分配性能更快,Java 语言还是 C/C++?答案可能令人惊讶 —— 现代 JVM
中的分配比执行得最好的 malloc 实现还要快得多。HotSpot 1.4.2 之后虚拟机中的 new
Object() 常见代码路径最多 10 条机器指令(Sun 提供的数据;请参阅 参考资料),而用 C 语言
实现的执行得最好的 malloc 实现,每个调用平均要求的指令在 60 到 100 条之间(Detlefs 等;请参
阅 参考资料)。而且分配性能在整体性能中不是一个微不足道的部分,测评显示:对于许多实际的 C 和
C++ 程序(例如 Perl 和 Ghostscript),整体执行时间中的 20% 到 30% 都花在 malloc 和
free 上,远远多于健康的 Java 应用程序在分配和垃圾收集上的开销(Zorn;请参阅 参考资料)。
继续,弄得一团糟
没有必要搜索众多的 blog 或 Slashdot 贴子,去寻找像“垃圾收集永远不会像直接内存管理一样有效”这样
能够说服人的陈述。而且,从某个方面来说,这些话说的是对的 —— 动态内存管理并不一样快 —— 而
是快得多。malloc/free 技术一次处理一个内存块,而垃圾收集机制则采用大批量方式处理内存管
理,从而形成更多的优化机会(以一些可以预见到的损失为代价)。
这条“听起来有理的意见” (以大批量清理垃圾要比一天到晚一点点儿清理垃圾更容易)得到了数据的证实。
一项研究(Zorn; 请参阅 参考资料)测量了在许多常见 C++ 应用程序中,用保守的
Boehm-Demers-Weiser(BDW)替换 malloc 的效果,结果是:许多程序在采用垃圾收集而不是传统
的分配器运行时,表现出了速度提升。(BDW 是个保守的、不移动的垃圾收集器,严重地限制了对分配
和回收进行优化的能力,也限制了改善内存位置的能力;像 JVM 中使用的那些精确的浮动收集器可以做
得更好。)
在 JVM 中的分配并不总是这么快,早期 JVM 的分配和垃圾收集性能实际上很差,这当然就是 JVM 分
配慢这一说法的起源。在非常早的时候,我们看到过许多“分配慢”的意见 —— 因为就像早期 JVM 中的一
切一样,它确实慢 —— 而性能顾问提供了许多避免分配的技巧,例如对象池。(公共服务声明:除了对
最重量的对象之外,对象池现在对于所有对象都是严重的性能损失,而且要在不造成并发瓶颈的情况下使
用对象池也很需要技巧。)但是,从 JDK 1.0 开始已经发生了许多变化;JDK 1.2 中引入的分代收集器
(generational collector)支持简单得多的分配方式,可以极大地提高性能。
分代垃圾收集
分代垃圾收集器把堆分成多代;多数 JVM 使用两代,“年轻代”和“年老代”。对象在年轻代中分配;如果它
们在一定数量的垃圾收集之后仍然存在,就被当作是”长寿的“,并晋升到年老代。
HotSpot 提供了使用三个年轻代收集器的选择(串行拷贝、并行拷贝和并行清理),它们都采用“拷贝”收
集器的形式,有几个重要的公共特征。拷贝收集器把内存空间从中间分成两半,每次只使用一半。开始时,
使用中的一半构成了可用内存的一个大块;分配器满足分配请求时,返回它没有使用的空间的前 N 个字节,
并把指针(分隔“使用”部分)从“自由”部分移动过来,如清单 1 的伪代码所示。当使用的那一半用满时,
垃圾收集器把所有活动对象(不是垃圾的那些对象)拷贝到另一半的底部(把堆压缩成连续的),然后从
另一半开始分配。
下载后可阅读完整内容,剩余4页未读,立即下载
普通网友
- 粉丝: 18
- 资源: 314
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 十种常见电感线圈电感量计算公式详解
- 军用车辆:CAN总线的集成与优势
- CAN总线在汽车智能换档系统中的作用与实现
- CAN总线数据超载问题及解决策略
- 汽车车身系统CAN总线设计与应用
- SAP企业需求深度剖析:财务会计与供应链的关键流程与改进策略
- CAN总线在发动机电控系统中的通信设计实践
- Spring与iBATIS整合:快速开发与比较分析
- CAN总线驱动的整车管理系统硬件设计详解
- CAN总线通讯智能节点设计与实现
- DSP实现电动汽车CAN总线通讯技术
- CAN协议网关设计:自动位速率检测与互连
- Xcode免证书调试iPad程序开发指南
- 分布式数据库查询优化算法探讨
- Win7安装VC++6.0完全指南:解决兼容性与Office冲突
- MFC实现学生信息管理系统:登录与数据库操作
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功