关闭

Java应用性能分析

标签: java性能优化
103人阅读 评论(0) 收藏 举报
分类:

性能分析

  • 概念:性能分析是一种从运行的应用程序中收集性能数据的活动,该活动可能会对应用程序的响应性吞吐量造成影响。其很少在生产环境中进行,通常在质量评估、测试或者开发环境中进行,作为监控活动发现性能问题时的后续活动。
  • 其包括方法分析内存分析

方法分析

  • 提供Java应用程序中方法执行时间的信息
  • 工具Oracle Solaris Studio Performance Analyzer,它能够对Java方法及本地方法进行分析。
  • 术语
    • 包含时间(Inclusive Time) 。方法自身及其子调用方法的执行时间总和。
    • 独占时间(Exclusive time)。执行某方法的时间,不含此方法调用其他方法的时间开销。
    • 归因时间(Attributed time)。被某方法调用所产生的时间开销。
    • 系统态CPU时间(System CPU)。方法运行在内核态时所占的时间或者时间比率。
    • 用户态CPU时间(User CPU)。方法运行在非内核态时所占的时间或者时间比率。
  • 指标:每个指标都细分为包含时间和独占时间
    1. 用户态CPU时间
    2. 系统态CPU时间
    3. 锁竞争时间 (用户态锁指标)
  • 性能分析步骤:
    1. 从Call Tree选项卡入手,从较高的层次快速了解应用程序在哪个用例上消耗了很多时间
    2. 从程序设计入手修改,

Call Tree

  1. 作为补充,使用Functions选项卡对样本数据进行分析,找出应用程序中执行最多的热点方法,改进某个方法实现

Functions选项卡

  1. 减少对系统态CPU的使用。系统调用所消耗的CPU时间可用于运行程序
  2. 尽量减少锁竞争(需要搞明白为什么锁竞争降低程序性能?)
  3. 方法分析中 <JVM-System>标识是个通用占位符,代表Java虚拟机内部进行垃圾收集、JIT编译、装载类及其他JVM内部管理活动所消耗的时间,按说方法分析的时候应该忽略。

内存分析

  • 同方法分析的着眼点不同,它提供Java应用程序内存的使用信息,包括内存中已分配对象的数目、大小以及活跃对象等信息,并附有对象分配时的栈追踪信息。
  • 工具:NetBeans Profiler
  • 术语

    • Allocated Objects(分配对象)。性能分析器跟踪的对象数
    • Live Objects(活动对象)。当前堆上分配的对象数目,这部分对象位于内存中。
    • Live Bytes(活动对象大小)。显示活动对象使用的堆内存大小。
    • Avg.Age(平均年龄)。活动对象的平均年龄,对象的年龄指该对象经历的垃圾收集次数。年龄总数除以活动对象数即为平均年龄
    • Generation(代)。根据活动对象进行统计。对象年龄是该对象经历垃圾收集次数。代的值是活动对象按年龄大小分成不同代之后的代的个数。按代排序常常可以帮助我们定位内存泄露的源头是哪一个类。这是因为代值的增加是内存泄露的一个典型特征。

    使用NetBeans Profiler 分析内存

  • 内存分析方法

    • 对结果进行快照,关注那些分配了大量内存并具有较短平均年龄的对象,这些是减少对象分配的良好着眼点。减少对象分配的方法和策略有:减少调整底层容器大小的次数池化对象(Netty中使用)。但是,通常情况下使用对象池不是一个好办法,除非分配回收这些对象的代价很大。缺点有:不易管理,提升编程难度,容易导致内存泄露,使用不当性能也是无法提高。或者说,这个和java编程思想是有违背的,应该作为最后的优化手段。
    • 定位内存泄露
    • 分析堆转储
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4385次
    • 积分:114
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    Java性能优化
    主要是《Java Performance》和《Java Performance Companion》的阅读笔记,也会掺杂一些个人理解,本人也是边学习边实践且水平有限,因此会有很多地方理解不正确,因此强烈建议对Java应用程序优化感兴趣的同学,去完整阅读原版书籍。
    文章分类
    文章存档