热点
系统架构师:移动H5站长MySQL事务控制实战精讲,reasoning_content:我们要求以系统架构师的口吻,写一个与技术、科技相关,关于[移动H5站长进阶:MySQL事务控制实战精讲]的标题需要直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn关键点:系统架构师口吻,技术、科技相关,围绕MySQL事务控制实战精讲,针对移动H5站长进阶标题要体现专业性和实战性,同时符合系统架构师的视角nn可能的架构师视角:MySQL事务控制实战精要 或者 系统架构师:移动H5站长必知的MySQL事务控制 但需要更简短nn考虑:30字以内,直接输出最好包含系统架构师或类似身份提示比如:系统架构师精讲:MySQL事务控制实战 但可能太泛或者架构师实战:MySQL事务控制与H5性能优化 但字数可能超nn更精准:针对移动H5站长进阶,所以可以写:移动H5站长进阶:架构师带你玩转MySQL事务控制 字数27?数一下:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 共17个汉字+一个冒号,算标点符号?标点不算字数?通常标题字数算汉字和字母数字中文标点一般不算字数但要求30字以内,是指字符数?通常指汉字保险起见:16个汉字(移动H5站长进阶:架构师带你玩转MySQL事务控制 其中H5是字母数字,算2个字符,汉字15个?更精确:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 移动(2)、H5(2)、站长(2)、进阶(2)、:(1)、架构师(3)、带你(2)、玩转(2)、MySQL(5)、事务控制(4) -> 总共2+2+2+2+1+3+2+2+5+4=25个字符30以内,可以nn但更简洁:可以去掉带你玩转,改成架构师详解MySQL事务控制实战或者系统架构师:MySQL事务控制实战精讲(15字)但需要体现移动H5站长进阶原题目是移动H5站长进阶:MySQL事务控制实战精讲,我们以系统架构师口吻,可以改成系统架构师视角:移动H5站长MySQL事务控制实战(19字)nn或者直接:架构师精讲:移动H5站长MySQL事务控制实战(17字)要包含技术、科技相关?其实事务控制就是技术,但题目要求与技术、科技相关,这自然相关所以没有问题nn输出一个标题即可我选择:系统架构师:移动H5站长MySQL事务控制实战精讲 字数:系统架构师(4)、:(1)、移动H5站长(5)、MySQL(5)、事务控制(4)、实战精讲(4) -> 4+1+5+5+4+4=23字完美
iOS开发进阶:MySQL事务处理与加载优化实战,reasoning_content:我们要求以加载优化师的口吻,写一个与技术、科技相关,关于[iOS开发进阶:精通MySQL事务处理与控制实战指南]的标题注意:主题是iOS开发进阶,但内容是MySQL事务处理与控制实战指南这似乎是一个跨领域的标题,实际上MySQL是数据库,通常与后端相关,但这里说iOS开发进阶,可能是指iOS开发中需要用到MySQL?或者是一个面向iOS开发者讲解MySQL事务的教程?要求简短精炼,30字以内需要体现加载优化师的口吻,可能带有优化、加载、性能等词汇但原书/文章标题是[iOS开发进阶:精通MySQL事务处理与控制实战指南],我们可以直接改编为更简洁的标题nn例如:iOS开发进阶:MySQL事务控制实战 但不够有加载优化师特色可以加上加载优化相关词汇?但主题是事务处理与控制,与加载关系不大或许可以用高性能、优化等词加载优化师通常关注加载速度、性能优化所以可以写:iOS开发中MySQL事务性能优化实战 但字数稍多考虑:iOS开发进阶:MySQL事务控制与性能优化 共17字或者更直接:iOS开发MySQL事务控制实战指南 但缺少进阶或者用原标题精简nn严格按要求:直接输出一个标题,不要加说明所以输出类似:iOS开发进阶:MySQL事务控制实战 但为了体现加载优化师,可以改为:iOS加载优化:MySQL事务控制实战?但与原主题稍偏最好保留iOS开发进阶或者:iOS开发进阶:MySQL事务性能优化指南 共18字符合30字nn我决定输出:iOS开发进阶:MySQL事务控制实战指南 共16字但没体现加载优化师口吻或许可以:iOS加载优化:MySQL事务控制与性能实战 17字或者:iOS开发进阶:MySQL事务控制与加载优化 18字我觉得后者不错,把加载优化融入进去但原主题是精通MySQL事务处理与控制,所以控制和处理都有我们可以写:iOS开发进阶:MySQL事务处理与加载优化实战 共20字这样既包含技术,又体现加载优化师nn最终选定:iOS开发进阶:MySQL事务处理与加载优化实战
Go语言MySQL事务控制实战解析与优化技巧,reasoning_content:我们要求以内容管理者的口吻,写一个与技术、科技相关,关于[Go语言MySQL事务控制实战解析与优化技巧]的标题要求直接输出一个标题,不要加说明提示等信息;简短精炼,字数控制在30字以内nn内容管理者口吻,可能偏向于实用、实战、解析、优化等标题要涵盖Go语言、MySQL事务控制、实战解析、优化技巧可以像“Go MySQL事务控制实战:解析与优化技巧”但注意字数或者更精炼:“Go语言MySQL事务控制实战与优化”需要控制在30字以内中文字数统计:每个汉字算一个,标点也算试试:“Go语言MySQL事务控制实战解析及优化技巧”字数:Go语言(2)、MySQL(5? 实际上MYSQL是5个字母但中文写成MySQL通常算一个词?严格说中文标题中“MySQL”算4个字符?通常我们认为“MySQL”是英文单词,在中文标题中算一个单位但字数统计时按字符算为了保险,用全中文:比如“Go语言MySQL事务控制实战解析与优化技巧” – 数一下:Go语言(2)、MySQL(5个英文字母但按中文算?最好用中文表达“MySQL”通常直接写,但字数可以按汉字加英文字母算,但题目要求字数控制在30字以内,通常指汉字字符数,英文算一个字符为了简单,用中文短语可以写:“Go语言MySQL事务控制实战解析与优化技巧”字符数:Go(2字母)、语言(2汉字)、MySQL(5字母)、事务控制(4汉字)、实战解析(4汉字)、与(1汉字)、优化技巧(4汉字) 总计:2+2+5+4+4+1+4=22个字符(英文字母算一个,汉字算一个)22
16 9 月 2026, 周三

不要被直觉误导 关于Java性能的9个谬论

副标题#e#

        【 技术】Java的性能有某种黑魔法之称。部分原因在于Java平台非常复杂,很多情况下问题难以定位。然而在历史上还有一种趋势,人们靠智慧和经验来研究Java性能,而不是靠应用统计和实证推理。在这篇文章中,我希望拆穿一些最荒谬的技术神话。

  1.Java很慢

  关于Java的性能有很多谬论,这一条是最过时的,可能也是最为明显的。

  确实,在上世纪90年代和本世纪初处,Java有时是很慢。

  然而从那以后,虚拟机和JIT技术已经有了十多年的改进,Java的整体性能现在已经非常好了。

  在6个独立的Web性能基准测试中,Java框架在24项测试中有22项位列前四。

  尽管JVM利用性能剖析仅优化常用的代码路径,但这种优化效果很明显。很多情况下,JIT编译的Java代码和C++一样快,而且这样的情况越来越多了。

  尽管如此,依然有人认为Java平台很慢,这或许源自体验过Java平台早期版本的人的历史偏见。

  在下结论之前,我们建议保持客观的态度,并且评估一下最新的性能结果。

  2.可以孤立地看待单行Java代码

  考虑下面这行短小的代码:

#p#副标题#e#

  4.算法慢是性能问题的最常见原因

  在开发者之间有一个很常见的认知错误(普通大众也是如此),即认为系统中他们控制的那部分很重要。

  在探讨Java性能时,这种认知错误也有所体现:Java开发者认为算法的质量是性能问题的主要原因。开发者考虑的是代码,因此他们自然会偏向于考虑自己的算法。

  实际上在处理一系列现实中的性能问题时,人们发现算法设计是根本问题的几率不足10%。

  相反,与算法相比,垃圾收集、数据库访问和配置错误导致应用程序缓慢的可能性更大。

  大部分应用处理的数据量相对较小,因此,即使主要算法效率不高,通常也不会导致严重的性能问题。可以肯定,我们的算法不是最优的;尽管如此,算法带来的性能问题还是算小的,更多性能问题是应用栈的其他部分导致的。

  因此我们的最佳建议是,使用实际生产数据来揭开性能问题的真正原因。要测量性能数据,而不是凭空猜测!

  5.缓存可以解决所有问题

  “计算机科学中的所有问题都可以通过引入一个中间层来解决。”

  David Wheeler的这句程序员格言(在互联网上,这句话至少还被认为是其他两位计算机科学家说的)非常常见,尤其是在Web开发者之中很流行。

  如果未能透彻理解现有的架构,而且分析也已停顿,往往就是“缓存可以解决所有问题”这种谬论抬头的时候了。

  在开发者看来,与其处理吓人的现有系统,还不如在前面加一层缓存,将现有系统隐藏起来,以此期待最好的情况。无疑,这种方式只是让整体架构更复杂了,当下一个接手的开发者打算了解系统现状时,情况会更糟糕。

  规模庞大、设计拙劣的系统往往缺乏整体的设计,是一次一行代码、一个子系统这样写出来的。然而很多情况下,简化并重构架构会带来更好的性能,而且几乎总是更容易让人理解。

  所以当评估是否真的有必要加入缓存时,应该先计划收集一些基本的使用统计信息(比如命中率和未命中率等),以此证明缓存层带来的真正价值。

  6.所有应用都需要关注Stop-The-World问题

  Java平台存在一个无法改变的事实:为运行垃圾收集,所有应用线程必须周期性停顿。有时这被当作Java的一个严重缺点,即使没有任何真凭实据。

  实证研究表明,如果数字数据(如价格波动)变化的频率超过200毫秒一次,人就无法正常感知了。

  应用主要是给人用的,因此我们有一个有用的经验法则,200毫秒或低于200毫秒的Stop-The-World(STW)通常是没有影响的。有些应用可能有更高的要求(如流媒体),但很多GUI应用是不需要的。

  少数应用(比如低延迟交易或机械控制系统)无法接受200毫秒的停顿。除非编写的就是这类应用,否则用户基本感觉不到垃圾收集器的影响。

  值得一提的是,在应用线程数量超过物理核数的任何系统中,操作系统必须控制对CPU的分时访问。Stop-The-World听着可怕,但实际上任何应用(不管是JVM还是其他应用)都要面对稀缺计算资源的争用问题。

  如果不去测量,JVM对应用性能有何附加影响是不清楚的。

  总之,请打开GC日志,以此来确定停顿时间是否真的影响了应用。通过分析日志来确定停顿时间,这里既可以手工分析,也可以利用脚本或工具分析。然后再判定它们是否真的给应用于带来了问题。最重要的是,问自己一个关键的问题:确实有用户抱怨吗?

#p#副标题#e#

  7.手写对象池适合一大类应用

  认为Stop-The-World停顿在某种程度上是不好的,应用开发团队的一个常见反应就是在Java堆内实现自己的内存管理技术。这往往会归结为实现一个对象池(甚至是全面的引用计数),而且需要使用了领域对象的任何代码都参与进来。

  这种技术几乎总是具有误导性的。它基于过去的认知,那时对象分配非常昂贵,而修改对象则廉价的多。现在的情况已经完全不同了。

  现在的硬件在分配时非常高效;最新的桌面或服务器硬件,内存带宽至少是2到3GB。这是一个很大的数字,除非专门编写的应用,否则要充分利用这么大的带宽还真不容易。

  一般来说,正确实现对象池非常困难(尤其是有多个线程工作时),而且对象池还带来了一些负面的要求,使这种技术不是一个通用的良好选择:

  • 所有接触到对象池代码的开发者必须了解对象池,而且能正确处理;

  • 哪些代码知道对象池,哪些代码不知道对象池,其界限必须让大家知道,并且写在文档中;

  • 这些额外的复杂性要保持更新,而且定期复审;

  • 如果有一条不满足,悄然出现问题(类似于C 中的指针复用)的风险就又回来了。

  总之,只有GC停顿不能接受,而且调校和重构也未能将停顿减小到可以接受的水平时,才能使用对象池。

  8.在垃圾收集中,相对于Parallel Old,CMS总是更好的选择

  Oracle JDK默认使用一个并行的Stop-The-World收集器来收集老年代,即Parallel Old收集器。

  Concurrent-Mark-Sweep (CMS)是一个备选方案,在大部分垃圾收集周期,它允许应用线程继续运行,但这是有代价的,而且有一些注意事项。

  允许应用线程与垃圾收集线程一起运行,不可避免地带来一个问题:应用线程修改了对象图,可能会影响对象的存活性。这种情况必须在事后加以清理,因此CMS实际上有两个STW阶段(通常非常短)。

  这会带来一些后果:

  • 必须将所有应用线程带到安全点,每次Full GC期间会停顿两次;

  • 尽管垃圾收集与应用同时执行,但应用的吞吐量会降低(通常是50%);

  • 在使用CMS进行垃圾收集时,JVM所用的簿记信息(和CPU周期)远高于其他的并行收集器。

  这些代价是不是物有所值,取决于应用的情况。但是天下没有免费的午餐。CMS收集器在设计上值得称道,但它不是万能的。

  所以在确定CMS是正确的垃圾收集策略之前,首先应该确认Parallel Old的STW停顿确实不能接受,而且已经无法调校。最后,我重点强调一下,所有指标必须从与生产系统等价的系统中获得。

  9.增加堆的大小可以解决内存问题

  当应用陷入困境,并且怀疑是GC的问题时,很多应用团队的反应就是增加堆的大小。在某些情况下,这样做可以快速见效,而且为我们留出了时间来考虑更周详的解决方案。然而,如果没有充分理解性能问题的原因,这种策略反而会让事情变得更糟糕。

  考虑一个编码非常糟糕的应用程序,它正在产生很多领域对象 (它们的生存时间很有代表性,比如说是2-3秒)。如果分配率高到一定程度,垃圾收集会频繁进行,这样领域对象会被提升到老年代。领域对象几乎是一进入年老代,生存时间就结束了,从而直接死亡,但它们直到下一次Full GC时才会被回收。

  如果增加了应用的堆大小,我们所做的不过是增加了相对短命的对象进入和死亡所用的空间。这会导致Stop-The-World停顿时间更长,对应用并无益处。

  在修改堆大小或者调校其他参数之前,理解对象的分配和生存时间的动态是很有必要的。没有测量性能数据就盲目行动,只会使情况更糟糕。在这里,垃圾收集器的老年代分布情况特别重要。

  结论

  当谈到Java的性能调校时,直觉常常起误导作用。我们需要实验数据和工具来帮助我们将平台的行为可视化并加强理解。

  垃圾收集就是最好的例子。对于调校或者生成指导调校的数据而言,GC子系统拥有无限的潜力;但是对于产品应用而言,不使用工具很难理解所产生数据的意义。

  默认情况下,运行任意Java进程(包括开发环境和产品环境),应该至少总是使用如下参数:

  • -verbose:gc(打印GC日志);

  • -Xloggc:(更全面的GC日志);

  • -XX:+PrintGCDetails(更详细的输出);

  • -XX:+PrintTenuringDistribution(显示JVM所使用的将对象提升进入老年代的年龄阈值)。

  然后使用工具来分析日志,这里可以利用手写的脚本,可以用图生成,还可以使用GCViewer(开源的)或jClarity Censum这样的可视化工具。

  作者:Ben Evans 译者:臧秀涛

  原文链接:http://www.infoq.com/articles/9_Fallacies_Java_Performance

  译文链接:http://www.infoq.com/cn/articles/9_Fallacies_Java_Performance

  关于作者

  Ben Evans是jClarity(这是一家创业公司,主要设计辅助开发和运维团队的性能工具)的CEO。他是LJC(伦敦Java用户组)的组织者之一,也是JCP执行委员会的成员之一,JCP执行委员会负责帮助定义Java生态系统中的相关标准。他还是Java Champion和JavaOne Rockstar。他与人合著了《The Well-Grounded Java Developer》一书。此外,他还经常进行公开演讲,探讨Java平台、性能、并发及相关话题。

  本文转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

dawei

【声明】:北京站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了

系统架构师:移动H5站长MySQL事务控制实战精讲,reasoning_content:我们要求以系统架构师的口吻,写一个与技术、科技相关,关于[移动H5站长进阶:MySQL事务控制实战精讲]的标题需要直接输出一个标题,不要加说明提示等信息简短精炼,字数控制在30字以内nn关键点:系统架构师口吻,技术、科技相关,围绕MySQL事务控制实战精讲,针对移动H5站长进阶标题要体现专业性和实战性,同时符合系统架构师的视角nn可能的架构师视角:MySQL事务控制实战精要 或者 系统架构师:移动H5站长必知的MySQL事务控制 但需要更简短nn考虑:30字以内,直接输出最好包含系统架构师或类似身份提示比如:系统架构师精讲:MySQL事务控制实战 但可能太泛或者架构师实战:MySQL事务控制与H5性能优化 但字数可能超nn更精准:针对移动H5站长进阶,所以可以写:移动H5站长进阶:架构师带你玩转MySQL事务控制 字数27?数一下:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 共17个汉字+一个冒号,算标点符号?标点不算字数?通常标题字数算汉字和字母数字中文标点一般不算字数但要求30字以内,是指字符数?通常指汉字保险起见:16个汉字(移动H5站长进阶:架构师带你玩转MySQL事务控制 其中H5是字母数字,算2个字符,汉字15个?更精确:移动H5站长进阶:架构师带你玩转MySQL事务控制 – 移动(2)、H5(2)、站长(2)、进阶(2)、:(1)、架构师(3)、带你(2)、玩转(2)、MySQL(5)、事务控制(4) -> 总共2+2+2+2+1+3+2+2+5+4=25个字符30以内,可以nn但更简洁:可以去掉带你玩转,改成架构师详解MySQL事务控制实战或者系统架构师:MySQL事务控制实战精讲(15字)但需要体现移动H5站长进阶原题目是移动H5站长进阶:MySQL事务控制实战精讲,我们以系统架构师口吻,可以改成系统架构师视角:移动H5站长MySQL事务控制实战(19字)nn或者直接:架构师精讲:移动H5站长MySQL事务控制实战(17字)要包含技术、科技相关?其实事务控制就是技术,但题目要求与技术、科技相关,这自然相关所以没有问题nn输出一个标题即可我选择:系统架构师:移动H5站长MySQL事务控制实战精讲 字数:系统架构师(4)、:(1)、移动H5站长(5)、MySQL(5)、事务控制(4)、实战精讲(4) -> 4+1+5+5+4+4=23字完美