资料
使用内存性能分析器查看应用的内存使用情况 HPROF Agent
Profile工具的使用
内存性能分析器概览
① 用于强制执行垃圾回收事件的按钮。 ② 用于捕获堆转储的按钮。 ③ 用于指定性能分析器多久捕获一次内存分配的下拉菜单。选择适当的选项可帮助您在进行性能剖析时提高应用性能。 ④ 用于缩放时间轴的按钮。 ⑤ 用于跳转到实时内存数据的按钮。 ⑥ 事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件。 ⑦ 内存使用量时间轴,它会显示以下内容: 一个堆叠图表,显示每个内存类别当前使用多少内存,如左侧的 y 轴以及顶部的彩色键所示。 一条虚线,表示分配的对象数,如右侧的 y 轴所示。 每个垃圾回收事件的图标。
内存计算方式
Java:从 Java 或 Kotlin 代码分配的对象的内存。 Native:从 C 或 C++ 代码分配的对象的内存。 Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。) Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关。 Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。 Others:您的应用使用的系统不确定如何分类的内存。 Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象。
查看内存分配情况(Record一段)
可以直接跳转到文件
选择检查的堆: default heap:当系统未指定堆时。 image heap:系统启动映像,包含启动期间预加载的类。此处的分配确保绝不会移动或消失。 zygote heap:写时复制堆,其中的应用进程是从 Android 系统中派生的。 app heap:您的应用在其中分配内存的主堆。 JNI heap:显示 Java 原生接口 (JNI) 引用被分配和释放到什么位置的堆。
Arrange by class:根据类名称对所有分配进行分组。这是默认值。 Arrange by package:根据软件包名称对所有分配进行分组。 Arrange by callstack:将所有分配分组到其对应的调用堆栈。
查看全局JNI引用
原生内存性能分析器
Allocations:在选定时间段内通过 malloc() 或 new 运算符分配的对象数。 Deallocations:在选定时间段内通过 free() 或 delete 运算符解除分配的对象数。 Allocations Size:在选定时间段内所有分配的总大小(以字节为单位)。 Deallocations Size:在选定时间段内所有已释放内存的总大小(以字节为单位)。 Total Count:Allocations 列中的值减去 Deallocations 列中的值所得的结果。 Remaining Size:Allocations Size 列中的值减去 Deallocations Size 列中的值所得的结果。
Allocations:堆中的分配数。 Native Size:此对象类型使用的原生内存总量(以字节为单位)。只有在使用 Android 7.0 及更高版本时,才会看到此列。 Shallow Size:此对象类型使用的 Java 内存总量(以字节为单位)。 Retained Size:为此类的所有实例而保留的内存总大小(以字节为单位)。
Depth:从任意 GC 根到选定实例的最短跳数。 Native Size:原生内存中此实例的大小。 只有在使用 Android 7.0 及更高版本时,才会看到此列。 Shallow Size:Java 内存中此实例的大小。 Retained Size:此实例所支配内存的大小(根据支配项树)。
将堆转储另存为 HPROF 文件
hprof-conv heap-original.hprof heap-converted.hprof
HPROF Agent
Binary Dump Format(format=b)
The binary output begins with the information:
[u1]* | An initial NULL terminated series of bytes representing the format name and version, in this implementation and historically, the string "JAVA PROFILE 1.0.1" (18 u1 bytes) followed by a NULL byte. If the TAG "HEAP DUMP SEGMENT" is used this string will be "JAVA PROFILE 1.0.2". | u4 | size of identifiers. Identifiers are used to represent UTF8 strings, objects, stack traces, etc. They can have the same size as host pointers or sizeof(void*), but are not required to be. | u4 | high word of number of milliseconds since 0:00 GMT, 1/1/70 | u4 | low word of number of milliseconds since 0:00 GMT, 1/1/70 |
Followed by a sequence of records that look like:
u1 | TAG: denoting the type of the record | u4 | TIME: number of microseconds since the time stamp in the header | u4 | LENGTH: number of bytes that follow this u4 field and belong to this record | [u1]* | BODY: as many bytes as specified in the above u4 field |
The following TAGs are supported:
STRING IN UTF8 | 0x01 |
ID | ID for this string | [u1]* | UTF8 characters for string (NOT NULL terminated) | | LOAD CLASS | 0x02 |
u4 | class serial number (always > 0) | ID | class object ID | u4 | stack trace serial number | ID | class name string ID | | UNLOAD CLASS | 0x03 |
| STACK FRAME | 0x04 |
ID | stack frame ID | ID | method name string ID | ID | method signature string ID | ID | source file name string ID | u4 | class serial number | u4 |
> 0 | line number | 0 | no line information available | -1 | unknown location | -2 | compiled method (Not implemented) | -3 | native method (Not implemented) | | | STACK TRACE | 0x05 |
u4 | stack trace serial number | u4 | thread serial number | u4 | number of frames | [ID]* | series of stack frame ID's | | ALLOC SITES | 0x06 |
u2 | Bit mask flags:
0x1 | incremental vs. complete | 0x2 | sorted by allocation vs. line | 0x4 | whether to force GC (Not Implemented) | | u4 | cutoff ratio (floating point) | u4 | total live bytes | u4 | total live instances | u8 | total bytes allocated | u8 | total instances allocated | u4 | number of sites that follow:
u1 | array indicator: 0 means not an array, non-zero means an array of this type (See Basic Type) | u4 | class serial number | u4 | stack trace serial number | u4 | number of live bytes | u4 | number of live instances | u4 | number of bytes allocated | u4 | number of instances allocated | | | HEAP SUMMARY | 0x07 |
u4 | total live bytes | u4 | total live instances | u8 | total bytes allocated | u8 | total instances allocated | | START THREAD | 0x0A |
u4 | thread serial number | ID | thread object ID | u4 | stack trace serial number | ID | thread name string ID | ID | thread group name ID | ID | thread parent group name ID | | END THREAD | 0x0B |
| HEAP DUMP or HEAP DUMP SEGMENT | 0x0C or 0x1C | Contains any number of sub-tags, each begins a u1 field (no order implied here):
ROOT UNKNOWN | 0xFF |
| ROOT JNI GLOBAL | 0x01 |
ID | object ID | ID | JNI global ref ID | | ROOT JNI LOCAL | 0x02 |
ID | object ID | u4 | thread serial number | u4 | frame number in stack trace (-1 for empty) | | ROOT JAVA FRAME | 0x03 |
ID | object ID | u4 | thread serial number | u4 | frame number in stack trace (-1 for empty) | | ROOT NATIVE STACK | 0x04 |
ID | object ID | u4 | thread serial number | | ROOT STICKY CLASS | 0x05 |
| ROOT THREAD BLOCK | 0x06 |
ID | object ID | u4 | thread serial number | | ROOT MONITOR USED | 0x07 |
| ROOT THREAD OBJECT | 0x08 |
ID | thread object ID | u4 | thread serial number | u4 | stack trace serial number | | CLASS DUMP | 0x20 |
ID | class object ID | u4 | stack trace serial number | ID | super class object ID | ID | class loader object ID | ID | signers object ID | ID | protection domain object ID | ID | reserved | ID | reserved | u4 | instance size (in bytes) | u2 | size of constant pool and number of records that follow:
u2 | constant pool index | u1 | type of entry: (See Basic Type) | value | value of entry (u1, u2, u4, or u8 based on type of entry) | | u2 | Number of static fields:
ID | static field name string ID | u1 | type of field: (See Basic Type) | value | value of entry (u1, u2, u4, or u8 based on type of field) | | u2 | Number of instance fields (not including super class's)
ID | field name string ID | u1 | type of field: (See Basic Type) | | | INSTANCE DUMP | 0x21 |
ID | object ID | u4 | stack trace serial number | ID | class object ID | u4 | number of bytes that follow | [value]* | instance field values (this class, followed by super class, etc) | | OBJECT ARRAY DUMP | 0x22 |
ID | array object ID | u4 | stack trace serial number | u4 | number of elements | ID | array class object ID | [ID]* | elements | | PRIMITIVE ARRAY DUMP | 0x23 |
ID | array object ID | u4 | stack trace serial number | u4 | number of elements | u1 | element type (See Basic Type) | [u1]* | elements (packed array) | | | HEAP DUMP END | 0x2C | Terminates a series of HEAP DUMP SEGMENTS.? Concatenation of HEAP DUMP SEGMENTS equals a HEAP DUMP. | CPU SAMPLES | 0x0D |
u4 | total number of samples | u4 | number of traces that follow:
u4 | number of samples | u4 | stack trace serial number | | | CONTROL SETTINGS | 0x0E |
u4 | Bit mask flags:
0x1 | alloc traces on/off | 0x2 | cpu sampling on/off | | u2 | stack trace depth | |
Basic Type
2 | object | 4 | boolean | 5 | char | 6 | float | 7 | double | 8 | byte | 9 | short | 10 | int | 11 | long |
Handling of Arrays
Commands can be sent to HPROF via the socket connection, the accepted COMMAND TAGS are:
FORCE GC (Not implemented) | 0x01 | DUMP HEAP | 0x02 | ALLOC SITES | 0x03 | HEAP SUMMARY | 0x04 | EXIT THE VM | 0x05 | DUMP TRACES | 0x06 | CPU SAMPLES | 0x07 | CONTROL | 0x08 | EOF (used to terminate socket connection) | 0xFF |
The commands take the form:
u1 | COMMAND TAG | u4 | serial number | u4 | number of bytes that follow | [u1]* |
ALLOC SITES |
u2 | Flags: | u4 | cutoff ratio (floating point between 0.0 and 1.0) | | CPU SAMPLES |
u2 | ignored | u4 | cutoff ratio (floating point between 0.0 and 1.0) | | CONTROL |
u2 | Sub option:
0x1 | Turn alloc traces on | 0x2 | Turn alloc traces off | 0x3 | Turn CPU sampling on:
ID | thread object ID (0 for all threads) | | 0x4 | Turn CPU sampling off:
ID | thread object ID (0 for all threads) | | 0x5 | Clear CPU sampling | 0x6 | Set max stack depth:
| | | |
|