首页 > 其他分享 >KOOM原理分析之一些基础知识

KOOM原理分析之一些基础知识

时间:2023-06-02 20:02:02浏览次数:63  
标签:Java DUMP KOOM 基础知识 内存 heap 原理 分配 Size



文章目录

  • 资料
  • Profile工具的使用
  • 内存性能分析器概览
  • 内存计算方式
  • 查看内存分配情况(Record一段)
  • 查看全局JNI引用
  • 原生内存性能分析器
  • 将堆转储另存为 HPROF 文件
  • HPROF Agent
  • Binary Dump Format(format=b)
  • Handling of Arrays


资料

使用内存性能分析器查看应用的内存使用情况 HPROF Agent

Profile工具的使用

内存性能分析器概览

KOOM原理分析之一些基础知识_Profile


① 用于强制执行垃圾回收事件的按钮。

② 用于捕获堆转储的按钮。

③ 用于指定性能分析器多久捕获一次内存分配的下拉菜单。选择适当的选项可帮助您在进行性能剖析时提高应用性能。

④ 用于缩放时间轴的按钮。

⑤ 用于跳转到实时内存数据的按钮。

⑥ 事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件。

⑦ 内存使用量时间轴,它会显示以下内容:

一个堆叠图表,显示每个内存类别当前使用多少内存,如左侧的 y 轴以及顶部的彩色键所示。

一条虚线,表示分配的对象数,如右侧的 y 轴所示。

每个垃圾回收事件的图标。

内存计算方式

KOOM原理分析之一些基础知识_性能分析_02


Java:从 Java 或 Kotlin 代码分配的对象的内存。

Native:从 C 或 C++ 代码分配的对象的内存。

Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)

Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关。

Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。

Others:您的应用使用的系统不确定如何分类的内存。

Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象。

查看内存分配情况(Record一段)

KOOM原理分析之一些基础知识_Profile_03

KOOM原理分析之一些基础知识_Java_04


可以直接跳转到文件

KOOM原理分析之一些基础知识_Hprof_05

KOOM原理分析之一些基础知识_Profile_06


选择检查的堆:

default heap:当系统未指定堆时。

image heap:系统启动映像,包含启动期间预加载的类。此处的分配确保绝不会移动或消失。

zygote heap:写时复制堆,其中的应用进程是从 Android 系统中派生的。

app heap:您的应用在其中分配内存的主堆。

JNI heap:显示 Java 原生接口 (JNI) 引用被分配和释放到什么位置的堆。

KOOM原理分析之一些基础知识_sed_07


Arrange by class:根据类名称对所有分配进行分组。这是默认值。

Arrange by package:根据软件包名称对所有分配进行分组。

Arrange by callstack:将所有分配分组到其对应的调用堆栈。

查看全局JNI引用

KOOM原理分析之一些基础知识_sed_08

原生内存性能分析器

KOOM原理分析之一些基础知识_sed_09

Allocations:在选定时间段内通过 malloc() 或 new 运算符分配的对象数。
Deallocations:在选定时间段内通过 free() 或 delete 运算符解除分配的对象数。
Allocations Size:在选定时间段内所有分配的总大小(以字节为单位)。
Deallocations Size:在选定时间段内所有已释放内存的总大小(以字节为单位)。
Total Count:Allocations 列中的值减去 Deallocations 列中的值所得的结果。
Remaining Size:Allocations Size 列中的值减去 Deallocations Size 列中的值所得的结果。

KOOM原理分析之一些基础知识_Java_10


Allocations:堆中的分配数。

Native Size:此对象类型使用的原生内存总量(以字节为单位)。只有在使用 Android 7.0 及更高版本时,才会看到此列。

Shallow Size:此对象类型使用的 Java 内存总量(以字节为单位)。

Retained Size:为此类的所有实例而保留的内存总大小(以字节为单位)。

KOOM原理分析之一些基础知识_Java_11


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


LOAD CLASS

0x02


UNLOAD CLASS

0x03


STACK FRAME

0x04


STACK TRACE

0x05


ALLOC SITES

0x06


HEAP SUMMARY

0x07


START THREAD

0x0A


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):


HEAP DUMP END

0x2C

Terminates a series of HEAP DUMP SEGMENTS.  Concatenation of HEAP DUMP SEGMENTS equals a HEAP DUMP.

CPU SAMPLES

0x0D


CONTROL SETTINGS

0x0E


ID

ID for this string

[u1]*

UTF8 characters for string (NOT NULL terminated)

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

u2Flags:u4cutoff ratio (floating point between 0.0 and 1.0)

CPU SAMPLES

u2ignoredu4cutoff ratio (floating point between 0.0 and 1.0)

CONTROL



标签:Java,DUMP,KOOM,基础知识,内存,heap,原理,分配,Size
From: https://blog.51cto.com/u_11797608/6404766

相关文章

  • QR防伪溯源系统追溯原理是什么?
    本文分享自天翼云开发者社区《QR防伪溯源系统追溯原理是什么?》,作者:SD万QR防伪溯源系统是一种基于QR技术的防伪技术,通过为每件产品生成唯一的QR标签,并将其与产品信息、生产信息、物流信息等进行关联,实现产品的全程追溯。本文将从追溯原理、系统构成、应用场景等方面对QR防伪溯源......
  • 可迭代对象、迭代器对象、异常捕获、for循环的原理、迭代取值和索引取值的对比
    整体构思:1.可迭代对象什么是迭代? 迭代言外之意就是更新换代,每次的更新都是要依赖于上一次的结果什么又是可迭代对象呢? ```就是内置有__iter__()方法的都可以称之为是可迭代对象``` "内置":可以直接点出来的就称之为是内置,既然可以点出来就可以直接拿来使用......
  • lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为
    如何联合索引查询?所以给定查询过滤条件age=18的过程就是先从termindex找到18在termdictionary的大概位置,然后再从termdictionary里精确地找到18这个term,然后得到一个postinglist或者一个指向postinglist位置的指针。然后再查询gender=女的过程也是类似的。最后得出age=18......
  • 深入剖析Linux IO原理和几种零拷贝机制的实现
    https://www.cnblogs.com/lsgxeva/p/11619464.html来源 https://zhuanlan.zhihu.com/p/83398714零壹技术栈   公众号【零壹技术栈】前言零拷贝(Zero-copy)技术指在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切......
  • 可迭代对象 迭代器 for循环内部原理 捕捉异常
    目录可迭代对象迭代器对象每次都生成一个新的可迭代对象,所以每次取值都是第一个元素只生成一个可迭代对象,每次取值基于一个可迭代对象取值迭代取值索引取值捕捉异常可迭代对象迭代就是每一次的结果必须依赖于上一次的结果#可迭代对象 内置有__iter__()方法的对象都是可迭代......
  • 读配置、讲原理、看面试真题,我只能帮你到这了。。。
    当我在写一上来就主从、集群、哨兵,这谁受得了的时候,好多小伙伴就迫不及待的留言想看这些模式了,今天我们就从配置文件、设计原理、面试真题三个方面来聊一聊Redis的主从复制。在Redis复制的基础上,使用和配置主从复制非常简单,能使得从Redis服务器(下文称replica)能精确的复制主......
  • Vue修改数组、对象并且触发视图更新的方法以及原理
    一、数组 items:['a','b','c'];//一个普通的数组this.items[1]='x';//修改已有项this.items[3]='d';//新增一项this.item.length=2;//修改数组的长度//一个对象数组msg:[{id:1,selected:true,title:'aaa',},{i......
  • 在线教育_Day03_项目前端相关基础知识一
    一、前端开发环境搭建1.1前端开发概述前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被行业所认可,到了2010年,互联网开始全面进入移动时代,前端开发的工作越来越重要。最初所有的开发工作都是由后端工程师完成的,随着业务越来越繁杂,工作量变大,......
  • 《加密与解密》- 第一章 - 基础知识 - 笔记
    (纠正了书中一些不正确的地方,如P11中2**64bytes等于16TB已修改为16EB)1.1什么是加密与解密1.1.1软件的加密与解密略1.1.2软件逆向工程内容:去除使用限制或者添加功能获得源代码硬件的复制和模拟要求品质:保持好奇,崇尚自由勤奋+毅力精通至少一门编程语言,尤其是编程思......
  • 强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE
    强化学习基础篇【1】:基础知识点、马尔科夫决策过程、蒙特卡洛策略梯度定理、REINFORCE算法1.强化学习基础知识点智能体(agent):智能体是强化学习算法的主体,它能够根据经验做出主观判断并执行动作,是整个智能系统的核心。环境(environment):智能体以外的一切统称为环境,环境在与智能体......