性能分析
- 概念:性能分析是一种从运行的应用程序中收集性能数据的活动,该活动可能会对应用程序的响应性或吞吐量造成影响。其很少在生产环境中进行,通常在质量评估、测试或者开发环境中进行,作为监控活动发现性能问题时的后续活动。
- 其包括方法分析和内存分析
方法分析
- 提供Java应用程序中方法执行时间的信息
- 工具:Oracle Solaris Studio Performance Analyzer,它能够对Java方法及本地方法进行分析。
- 术语:
- 包含时间(Inclusive Time) 。方法自身及其子调用方法的执行时间总和。
- 独占时间(Exclusive time)。执行某方法的时间,不含此方法调用其他方法的时间开销。
- 归因时间(Attributed time)。被某方法调用所产生的时间开销。
- 系统态CPU时间(System CPU)。方法运行在内核态时所占的时间或者时间比率。
- 用户态CPU时间(User CPU)。方法运行在非内核态时所占的时间或者时间比率。
- 指标:每个指标都细分为包含时间和独占时间
- 用户态CPU时间
- 系统态CPU时间
- 锁竞争时间 (用户态锁指标)
- 性能分析步骤:
- 从Call Tree选项卡入手,从较高的层次快速了解应用程序在哪个用例上消耗了很多时间
- 从程序设计入手修改,
- 作为补充,使用Functions选项卡对样本数据进行分析,找出应用程序中执行最多的热点方法,改进某个方法实现
- 减少对系统态CPU的使用。系统调用所消耗的CPU时间可用于运行程序
- 尽量减少锁竞争(需要搞明白为什么锁竞争降低程序性能?)
- 方法分析中
<JVM-System>
标识是个通用占位符,代表Java虚拟机内部进行垃圾收集、JIT编译、装载类及其他JVM内部管理活动所消耗的时间,按说方法分析的时候应该忽略。
内存分析
- 同方法分析的着眼点不同,它提供Java应用程序内存的使用信息,包括内存中已分配对象的数目、大小以及活跃对象等信息,并附有对象分配时的栈追踪信息。
- 工具:NetBeans Profiler
术语
- Allocated Objects(分配对象)。性能分析器跟踪的对象数
- Live Objects(活动对象)。当前堆上分配的对象数目,这部分对象位于内存中。
- Live Bytes(活动对象大小)。显示活动对象使用的堆内存大小。
- Avg.Age(平均年龄)。活动对象的平均年龄,对象的年龄指该对象经历的垃圾收集次数。年龄总数除以活动对象数即为平均年龄
- Generation(代)。根据活动对象进行统计。对象年龄是该对象经历垃圾收集次数。代的值是活动对象按年龄大小分成不同代之后的代的个数。按代排序常常可以帮助我们定位内存泄露的源头是哪一个类。这是因为代值的增加是内存泄露的一个典型特征。
内存分析方法
- 对结果进行快照,关注那些分配了大量内存并具有较短平均年龄的对象,这些是减少对象分配的良好着眼点。减少对象分配的方法和策略有:减少调整底层容器大小的次数,池化对象(Netty中使用)。但是,通常情况下使用对象池不是一个好办法,除非分配回收这些对象的代价很大。缺点有:不易管理,提升编程难度,容易导致内存泄露,使用不当性能也是无法提高。或者说,这个和java编程思想是有违背的,应该作为最后的优化手段。
- 定位内存泄露,
- 分析堆转储