代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

30丨“代码经济篇”答疑汇总

降低共享变量读写频率
使用volatile实现内存语义
使用流处理减少内存占用
分段传递给签名接口
WebAuthn协议
新技术如指纹、面部识别
传统身份认证方式
Java模块化
实时性能监控工具
性能调试工具
性能回归测试
JMH
局部变量减少主存与线程内存的拷贝次数
双检锁与内存语义bug
签名数据处理
密码登录的问题
软件尺寸对云服务和微服务的影响
性能监控、评测、分析
集中解答留言区里的一些疑问
专栏第二模块“经济的代码”已经更新完毕
代码经济篇答疑汇总

该思维导图由 AI 生成,仅供参考

到这一篇文章,意味着专栏第二模块“经济的代码”已经更新完毕了。非常感谢同学们积极踊跃地留言,提出了很多独到的见解,我自己也学到了不少新东西。
今天,我来集中解答一下留言区里的一些疑问。有很多问题,我们已经在留言区里讨论了。这里,我们就挑选一些还没有解决掉的问题,深入讨论一下。
@秦凯
对性能和资源消耗有一定的意识,但是在具体的开发过程中或者应用运行过程中要对性能进行监控、评测、分析,就束手无策了。
:我一直都认为,有了意识,其实就成功一大半了。有了意识,我们就会去寻找技术,寻找工具,寻找解决的办法。到了这个专栏的第三个部分(也是接下来要更新的“安全篇”),我们就会更强烈地感受到,“要有意识”是我们首先要获得的能力。大部分代码的问题,其实都是意识和见识带来的问题。
回到这个问题本身,性能的监控、评测和分析,我们通常要通过一定的工具来解决。
第一个常用的工具是 JMH,我们在第 26 篇里简单介绍了这个小工具的用法。JMH 可以用来测试一个接口、一段代码跑得有多快。特别是当我们面临两个选择,并且犹豫不决的时候,对比 JMH 的测试结果,就可以给我们提供一个大致准确的方向。
第二个常用的工具是性能回归测试。我们经常修改代码,修改后的代码性能有没有变坏?这是一个值得我们警惕的问题。我们可以通过自动化的性能回归测试,来检测修改有没有恶化代码的性能。就像普通的回归测试一样,性能回归测试也需要写测试代码。编写自动的回归测试代码就相当于我们制造了一个工具。从长远看,工具可以提升我们的工作效率。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文围绕“代码经济”展开讨论,涉及性能监控、代码尺寸、身份认证、签名数据处理等多个技术领域。作者深入解答读者提出的问题,涵盖了性能监控工具、代码尺寸对云服务和移动计算的影响、身份认证技术的发展趋势以及签名数据处理的优化方法。此外,还讨论了volatile关键字、内存模型以及局部变量在降低共享资源读写频率方面的作用。总体而言,本文内容丰富,为读者提供了丰富的技术知识和解决问题的思路。文章还展望了下一部分“安全的代码”的学习内容,将采用案例分析的形式进行学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 浅吟且行的未来
    范老师好,我想问下为什么temporaryMap会被赋值两次,分别对应第4行和第8行。 我的理解是:Java里非基本数据类型是引用传递,那helloWordsMap的更新会直接更新temporaryMap,所以我不理解为什么会赋值两次?

    作者回复: “引用传递”的理解可能误导了你。学习C语言和Java语言的时候,可以把赋值都看作值传递,然后去理解不同的类型传递的值到底是什么,也就是到底是什么值。 比如,这个例子的helloWordsMap和temporaryMap的两个变量,其实它们的值都是指向一个map的地址。map的变化,并不会引起指向这个map的地址的变化。所以,才会有让人迷惑的“引用传递”的说法。但是,helloWordsMap和temporaryMap这两个指向map地址变量,是可以变化的。而且,它们的变化都是独立的,不传递的。 第一次赋值,helloWordsMap和temporaryMap相同了,指向同一个地址。需要注意的是,但从变量本身看,helloWordsMap和temporaryMap是两个不同的变量,一个变量的变化,对另外一个变量没有影响。你可以仔细琢磨一下我说的值传递。 第一次赋值后,helloWordsMap可能指向null地址,然后temporaryMap就也有可能指向null。同步时,需要检查helloWordsMap是不是还是指向null。如果helloWordsMap已经不指向null了,temporaryMap依然是指向null的,这时候,就要更新temporaryMap的指向地址。所以,需要第二次赋值。

    2019-05-19
    5
  • aaa
    延迟分配是指延迟同步嘛,还是不会同步,如果是延迟同步的话是什么时候才会同步

    作者回复: 延迟分配和同步是两个概念,分开理解更容易些。 关于延迟分配,参见地二十四讲。 如果非要放一起的话: 延迟分配,有的时候可以免除同步,有的时候降低同步,有的时候没什么影响。你看,和不放一起没什么两样。更多的具体的例子,请参考《Effective Java》。

    2019-04-16
    1
  • 空知
    helloWordsMap = temporaryMap; helloWordsMap 还是指向了temporaryMap,temporaryMap发生变化 helloWordsMap 还是要同步的吧?

    作者回复: 是的,这么复杂的延迟分配代码,要解决的就是helloWordsMap变化的同步问题。

    2019-03-13
    1
  • 往事随风,顺其自然
    怎么判断由voliate 修饰的变量是否会反复变化,来决定是否采用临时变量引用

    作者回复: 一般采用延迟分配方法的代码,都很简单,而且变量仅赋值一次。其他的场合,还要看具体的代码。 比如final修饰的变量,就不会反复变化。

    2019-03-13
    1
  • ifelse
    我们就会更强烈地感受到,“要有意识”是我们首先要获得的能力。大部分代码的问题,其实都是意识和见识带来的问题。--记下来
    2022-07-28归属地:陕西
  • ifelse
    学习了
    2022-07-28归属地:北京
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部