性能测试实战 30 讲
高楼
前 HP 高级性能专家,7DGroup 创始人
45941 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 37 讲
性能测试实战 30 讲
15
15
1.0x
00:00/00:00
登录|注册

20丨Java & C ++:代码级监控及常用计数器解析(下)

C/C++
Java
性能分析

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

在上一篇文章中,我们描述了在 Java 开发语言中如何抓取方法的执行时间,其中描述的操作也是我们在分析时经常使用的。
今天我们将接着描述如下几点内容:
Java 语言中如何查找有问题的内存对象。
简单介绍一下在 C/C++ 语言中如何查找方法执行时间和对象的内存消耗。
之所以要描述 C/C++ 语言的相关内容,就是为了告诉你,几乎在任何一语言中都有相应的工具,都有办法捕获到相应的内容。
下面我们来看看如何抓取 Java 应用中对象占用多大内存,以及如何分辨占用是合理的和不合理的。

Java 类应用查找对象内存消耗

对 Java 的内存分析通常都落在对 JVM 的使用上(不要认为我这句话说得片面),再具体一点,说的就是内存泄露和内存溢出。由于现在对象都是可变长的,内存溢出就不常见了;而由于底层框架的慢慢成熟,内存泄露现在也不常见了。
有人说了,那你还啰嗦个什么劲呢?别捉急呀,不常见不等于没有。只是说它不再是 No.1 级的问题,但是排在 No.2 级还是没问题的。
如果你的应用有了问题,看到了像这样的图:
这是我在一个项目中遇到的问题,图片不够清晰,我们只要关注黄线的趋势就好。
之所以把它拿出来说事,是因为这个问题太极端了。上图是近 20 天的 JVM 使用率,从曲线的趋势上就可以看出来,它存在明显的内存泄露,但是又泄露得非常非常慢。这个系统要求 24x365 运行。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了在Java和C/C++开发语言中进行代码级监控及常用计数器解析的方法。首先,讨论了在Java中查找有问题的内存对象和抓取对象占用的内存大小的技术。然后,简要介绍了在C/C++中查找方法执行时间和对象的内存消耗的方法。作者强调了不同语言都有相应的工具和方法来捕获相关内容。接着,从内存趋势判断和查找增加的内存两个逻辑出发,详细介绍了性能测试过程中内存变化的判断方法,并给出了实际案例进行分析。最后,指出在Java中查找内存消耗的手段还有很多,并给出了两种常用又易用的方式。整体而言,本文内容涵盖了Java和C/C++语言中代码级监控及常用计数器解析的相关知识点,对于从事性能测试分析的人员具有一定的参考价值。文章通过介绍google-perftools和valgrind等工具,以及相应的使用方法,为读者提供了在性能分析过程中解决代码问题的思路和方法。文章还提出了两个思考题,引导读者深入思考代码的性能分析过程和分析链路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《性能测试实战 30 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • kaixin
    时间和空间。 时间是指执行的够不够快,快才能在同样的时间内处理更多的请求 空间就是内存,每个形成的对象小,或者使用后释放快,才能在固定内存下有更多对象可以使用内存

    作者回复: 说的非常好。

    2021-01-19
    9
  • johnny
    对代码的性能分析过程中,主要是哪两点? 1.运行速度 2.占用内存 针对代码分析的这两点,有什么样的分析链路? 链路的分析思路还是先分析系统架构、然后分段,分层,先全局后定向。 运行速度分析链路 响应时间长->分段拆分时间->操作系统->进程->线程->方法或函数CPU执行时间 占用内存分析链路 响应时间长->分段拆分时间->操作系统->进程->线程->对象或变量内存使用情况

    作者回复: 总结的不错,可以出师了。哈哈

    2021-05-29
    4
  • 小老鼠
    代码级的性能分析应该由开发人员作还是测试人员作?我个人观点是测试人员测试是否存在性能问题,比如内存泄漏,再由开发人员去定位,当然有全栈工程师更好。

    作者回复: 这看似是一个不需要回答的问题。😃😃😃 我只关心问题是否能解决,不关心是谁。如果你非要划分为测试人员不懂开发技能是合理的话,那你这个说法就没毛病。 而对我带的性能团队来说,开发能力是基本能力。

    2020-02-25
    2
    2
  • 王顺
    时间和空间

    作者回复: 精辟。

    2021-11-22
  • jy
    原文内容:“实际上,这张图说明以下四点:年轻代(第三列)、年老代(第四列)全满了,持久代在不断增加,并且也没有释放过。两个保留区(第一列、第二列)都是空的。Yonug GC(第六列)已经不做了。Full GC(第八列)一直都在尝试做回收的动作,但是一直也没成功,因为年轻代、年老代都没回收下来,持久代也在不停涨。如果出现了 1 和 2 的话,不用看什么具体对象内存的消耗,只要像网上那些只玩 JVM 参数的人一样,调调参数就行了。“ 问题:具体是如何调参数呢?

    作者回复: 加大jvm内存。但不能解决问题。只有解决瓶颈才可以解决问题。

    2021-06-25
  • alley
    老师,我在平时测试性能基线中发现有缓慢的性能泄露问题,开发说不用管,触发FullGC来回收内存;那FullGC的时候,是不是系统业务不可用?

    作者回复: stw的时候服务肯定不可用呀,不管什么gc策略都会有fullgc。 但是你的描述有不太合理的,你说有泄露。有泄露就意味着fullgc也回收不了,能回收得了就不叫泄露了。 所以你要给出具体的数据拿来看看才能知道。

    2021-01-04
  • chailyn
    卡在分析了,windows系统如何监控分析c/c++语言程序的CPU,感觉还是很懵呀

    作者回复: 手段是一样的。

    2020-10-19
  • 月亮和六便士
    高老师,1. gc, FGC 多久一次算正常?我经常看到书籍上说什么频繁的Fgc ,不知道怎么样算频繁,2. jvm设置多大 与总内存有比例关系么,比如我有120G内存,我设置3G xmx 这个要怎么确定?

    作者回复: 1. 没有确定的标准说FGC多久一次正常。只要对性能不产生大的影响就可以。 2. 这个没有标准,要根据实用架构来做计算。

    2020-04-08
    3
  • 安排
    valgrind分析大型程序比较慢,有没有其他好用的快的工具呢?

    作者回复: 精准分析,在代码中加perftool应该会快一些。或者根据目标用调试工具。

    2020-04-01
  • 吴小喵
    老师,为什么我的jvisualvm没有Deltas

    作者回复: 截图发我看看。

    2020-02-28
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部