首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 内存申请分析

作者:amritazhou 最近一直在做有关内存方面的优化工作,在做优化的过程,除了关注内存的申请量以及GC的情况之外,我们经常需要想方法找出是那些对象占用了大量内存,以及他们是如何导致GC的,这意味着我们需要获取对象申请的信息...对象的信息: 这种使用方式相当直观,可以看到申请对象大小,数量,还有堆栈等,通过这些信息,我们可以作为我们接下来进行内存优化的参考 但是,对于这种获取申请对象信息的方法,会存在几个问题: 1、获取的信息过于分散...AllocTracker.cpp这里的方法: 从上面的代码可以看出,在开启了Allocation Tracker之后,在Dalvik全局变量gDvm下,将其中的allocRecords指向了一块新的申请的内存区域...对Allocation Tracker的响应过程就非常清晰了: 1、在收到Allocation Tracker的请求的时候,首先给Dalvik全局变量gDvm中的allocRecords字段指向一段新申请的内存...,申请内存的大小,由gDvm.allocRecordMax指定; 2、后续Dalvik每次新申请对象的时候,只要allocRecords不为NULL,那就会不断的往allocRecords指向的内存区域中写入的新申请对象的信息

1.7K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kmalloc申请内存源码分析

    本节我们重点分析下Kmalloc的实现,其实在驱动中大家使用最多的就是用kmalloc申请内存,kmalloc申请的内存大小都普遍比较小,比较快,而且物理地址和虚拟地址是线性映射的,因为kmalloc拿到的内存是从...2个参数,第一个参数就是要申请的大小,第二个参数就是申请内存的一些flag,比如常见的GFP_KERNEL 大家也看下注释都有哪些flag,这些flag都代表啥意思,是否可以睡眠,是否是原子操作等 __...也就是申请太大的内存,就不用直接找我slab了,直接去找buddy拿吧 通过kmalloc_slab去获取对应大小的kmem_cache缓冲池 调用slab_alloc从对应的kmem_cache中去申请一个...所以说来说去,还是从slab去申请内存,里面的内存就和上一节的内存一样了。 如果size大于4K,每个平台,每个版本,每个slab的实现大小不一样。...kmalloc_caches[index]; } 根据size计算出一个index,此index就是kmalloc_caches数组下标,此数据中有对应很多个大小的kmalloc_cache缓冲池 如果申请的内存是从

    2.1K20

    Linux申请大页内存(mmap)

    ---- 1.为什么要使用大页内存   了解操作系统内存管理的人一般都知道操作系统对内存采用多级页表和分页进行管理,操作系统每个页默认大小为4KB。...当多个内存密集型应用访问内存时,会造成过多的TLB未命中,因此在特定情况下会需要减少未命中次数,一个可行的办法就是增大每个页的尺寸。...---- 2.怎样使用大页内存 2.1 先预留一定量的大页内存 #先查看系统有多少已经预留的大页内存 # cat /proc/meminfo |grep -i huge #预留192个大页 # sysctl...vm.nr_hugepages=192 #查看是否预留成功 # cat /proc/meminfo |grep -i huge 2.2 通过系统调用来从预留的大页内存中申请大页 #include <sys...\n"); getchar(); munmap(m, s); return 0; } ---- 3.最后的话 大页内存的好处不仅是减少TLB未命中次数,而且大页内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上

    11.9K110

    Java通过JNI申请直接内存

    方法名称不能错哦 JNIEXPORT void JNICALL Java_JNINativeMemory_allocateMemory(JNIEnv *env, jobject j) { // 申请内存...函数申请内存, 主要就是要观察在Java中, 堆外内存/直接内存的申请方式, 以及如何被管理的....在Java中可以通过使用ByteBuffer.allocateDirect() 和 unsafe.allocateMemory() 以及本文介绍的通过JNI申请内存, 这三种方式的区别是什么呢?...mmap申请的内存, 我们拿到的起始地址就是maps中显示的地址, 是吻合的....而Java方式拿到的地址, 还是一样, 偏差了0x10 简单说, malloc底层调用mmap系统函数申请内存(还有一种是brk系统函数), 只是malloc又对从操作系统拿到的内存做了手脚, 之所以做手脚是为了合理管理内存

    1.3K30

    常见内存错误

    初始化堆栈中的数据 对申请的内存或自动变量进行初始化是一个好习惯,例如: int test() { int *a = (int*) malloc(10); /*判断是否申请成功*/.../*将其初始化为0*/ memset(a,0,10); /*do something*/ return 0; } 我们经常需要在使用前将其初始化为0或使用calloc申请内存...指针不等同于其指向的对象 我们可能常常错误性地认为指针对象的大小就是数据本身的大小,最常错误使用的就是下面的情况: /*bad code*/ int test(int a[]) { size_t...申请的内存不使用时需要释放 使用malloc等申请的内存如果不使用free进行释放,将会引起内存泄露。长期运行将会导致可用内存越来越少,程序也将会变得越来越卡顿。...上面所列出的仅仅是一些比较常见的内存相关问题,总结如下: 自动变量或申请的内存需要初始化 避免缓冲区溢出 指针不等同于指向的对象 指针运算以指向大小为单位 避免对NULL或已释放的内存进行引用 申请的内存不使用时及时释放

    83420

    Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores

    Postgresql启动后申请两段内存,在启动时会判断系统支持情况,默认是使用mmap申请共享内存。...《Linux内存映射函数mmap与匿名内存块》 ipc的共享内存,只申请PGSharedMemoryCreate大小。...《Linux共享内存与子进程继承》 Postgresql的共享内存在9.2以后就是使用mmap申请的了,在少数情况下使用ipc的共享内存。...IPC的共享内存: 在当前例子中,IPC的共享内存只申请了一个PGShmemHeader的空间,没有其他空间可以使用。...在这个步骤前,直接使用ShmemAlloc申请共享内存,调整freeoffset位置 在这个步骤后,使用ShmemInitStruct申请共享内存,先在哈希表中创建一个索引条目,在使用ShmemAlloc

    75920

    探秘malloc是如何申请内存的

    今天分析下malloc申请内存时都发生了什么,Let dot it 我们都清楚malloc申请的内存不是立刻就建立虚拟地址和物理地址的映射的,当int *p = malloc(100*1024)执行这条指令之后...当malloc申请的内存小于128K的时候是属于heap的,自己可以动手实验下。当申请的内存大于128K之后,就会从mmap区域申请内存的。...当写malloc申请的内存0x76143BC000的时候,就会发生缺页异常,发生page_fault。...return ret; } 如果pmd里面的值是NULL,所以pte不存在,设置pte为NULL 判断此vma是否是匿名页,通过判断vma→vm_ops是否为NULL, 啥是匿名页: malloc申请的内存...stack里申请的内存 mmap申请的匿名的内存映射 以上三种都属于匿名页 很明显我们是malloc申请的内存,就会走到匿名页里面去 如果不是匿名页,那就是有文件背景的页,就是和映射的时候有对应的实体

    2.4K51

    【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

    文章目录 一、 报错信息 二、 内存排查 三、 代码分析及修改 四、 不同版本说明 参考以下博客 : 【Android 内存优化】Android Profiler 工具常用功能 ( 监测内存 | 内存快照...) 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 ) 【Android 内存优化...】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 ) 一、 报错信息 ---- 启动...; 开始执行时运行平稳 , 内存一直保持在 97.4 MB 左右 ; 开启某方法后 , 显示某自定义组件 , 不断循环绘制某多边形 , 出现如下内存情况 : 二、 内存排查 ---- 点击内存监控面板左上角的...在 Android 10 操作系统中没有 , 在 Android 7 操作系统中出现 , 这个问题要注意 , 开发时要在不同版本的手机中进行内存性能优化测试 ;

    99810

    申请内存时底层发生了什么?

    ---- 内存的申请释放对程序员来说就像空气一样自然,你几乎不怎么能意识到,有时你意识不到的东西却无比重要,申请过这么多内存,你知道申请内存时底层都发生什么了吗?...现在我们知道了,如果malloc自己维护的内存空间不足将通过brk系统调用向操作系统申请内存。这样malloc就可以把这些从操作系统申请到的内存当做新的空闲内存块分配出去。...我们看到的冰山是这样的:我们向malloc申请内存,malloc内存不够时向操作系统申请内存,之后malloc找到一块空闲内存返回给调用者。...但是,你知道吗,上述过程根本就没有涉及到哪怕一丁点物理内存!!! 我们确实向malloc申请到内存了,malloc不够也确实从操作系统申请到内存了,但这些内存都不是真的物理内存,NOT REAL。...答案是当我们真正使用这段内存时,当我们真正使用这段内存时,这时会产生一个缺页错误,操作系统捕捉到该错误后开始真正的分配物理内存,操作系统处理完该错误后我们的程序才能真正的读写这块内存。

    69910

    Win3内存管理之私有内存跟共享内存的申请与释放

    一丶内存简介私有内存申请   通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的. 有私有内存跟共享内存....但是我们知道物理内存是一个页.所以申请一个页即可. DWORD flAllocationType, 申请内存的类型. 是这样的.我们申请内存在物理页....给这个指定进程申请内存. new malloc的区别. 请注意.真正申请内存的其实是API. 而new malloc 是申请堆内存....而 malloc的底层是通过 HeapAlloc申请的. 并没有进0环(内核) 二丶共享内存申请 1.共享内存申请   共享内存其实就是物理页可以共享使用了. A进程申请物理页往这个物理页填写内容....只不过会返回文件对象已经存在的错误. 2.线性地址(虚拟地址) 关联物理页.   上面申请了物理页.那么我们还需要将这个物理页映射到线性地址.需要的API如下.

    1.4K20

    动态内存管理申请调整和释放

    动态内存管理存放在内存中的堆区中 动态内存分配的函数:malloc、calloc、realloc、free malloc函数(内存申请空间)无初始化 分配一个大小字节的内存块,返回一个指向该块开头的指针...malloc:是用来申请内存空间的 free函数(动态内存释放) free:可以释放申请的内存 主动释放动态开辟的内存空间 注意free不能将接收的指针赋值为NULL,需要主动赋值为NULL 代码...errno.h> #include #include//malloc头文件 int main() { int* p =(int*)malloc(40);//申请...MAX); if(p==NULL) { printf("%s", strerror(errno)); return 1; } calloc函数(内存空间申请...)初始化 malloc不存放元素打印出随机值,malloc申请到的空间没有初始化,直接返回的起始地址,效率高 而calloc申请好空间后,会把空间初始化为0,返回起始地址 #include<stdio.h

    14310

    全网最硬核 JVM 内存解析 - 2.JVM 内存申请与使用流程

    网上有很多关于 JVM 内存结构的分析以及图片,但是由于不是一手的资料亦或是人云亦云导致有很错误,造成了很多误解;并且,这里可能最容易混淆的是一边是 JVM Specification 的定义,一边是...reserved 和 committed JVM 内存申请与使用流程(全网最硬核 JVM 内存解析 - 2.JVM 内存申请与使用流程开始) Linux 下内存管理模型简述 JVM commit...JVM 内存申请与使用流程 2.1....这样,程序申请以及访问的其实是虚拟内存地址,MMU 会将这个虚拟内存地址映射为实际的物理内存地址。...NULL : addr; } 第二步,JVM 的每个子系统,按照各自的策略,通过 Commit 第一步 Reserve 的区域的一部分扩展内存(大小也一般页大小对齐的),从而向操作系统申请映射物理内存,

    1.1K30

    应用 AddressSanitizer 发现程序内存错误

    AddressSanitizer 概述 AddressSanitizer 是一个基于编译器的测试工具,可在运行时检测 C/C++ 代码中的多种内存错误。...AddressSanitizer 基本使用 根据 AddressSanitizer Wiki 可以检测下面这些内存错误 Use after free:访问堆上已经被释放的内存 Heap buffer overflow...Use after scope:栈对象使用超过定义范围 Initialization order bugs:初始化命令错误 Memory leaks:内存泄漏 这里我只简单地介绍下基本的使用,详细的使用文档可以看官方的编译器使用文档...还有一个是内存泄漏,比如下面的代码,显然 p 所指的内存没有被释放。...这是由于在使用模糊测试工具时,它们通常都是通过检查返回码来检测这种错误。

    2.7K41

    物理内存充足,但是为什么用代码总申请不到内存呢?

    背景 某次遇到一个客户尝试用 Java (其实跟具体用什么语言没关系)申请使用 4G 的内存申请,机器(ECS)总内存是 8G,free 的内存也超过 4G,按道理是 OK 的,但总是直接 OOM。...申请4g内存失败 如上图所示,记录显示为申请 4G 内存失败(4294967296 B / 1024 / 1024 = 4096 M)。...是否是 min_free_kbytes & nr_hugepage 配置错误?...内核将检查是否有足够的可用内存供应用进程使用; 如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。...overcommit_memory=2 当请求申请的内存 >= SWAP内存大小 + 物理内存 * N,则拒绝此次内存申请。

    1.8K70

    物理内存充足,但是为什么用代码总申请不到内存呢?

    背景 某次遇到一个客户尝试用 Java (其实跟具体用什么语言没关系)申请使用 4G 的内存申请,机器(ECS)总内存是 8G,free 的内存也超过 4G,按道理是 OK 的,但总是直接 OOM。...申请4g内存失败 如上图所示,记录显示为申请 4G 内存失败(4294967296 B / 1024 / 1024 = 4096 M)。...是否是 min_free_kbytes & nr_hugepage 配置错误?...内核将检查是否有足够的可用内存供应用进程使用; 如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。...overcommit_memory=2 当请求申请的内存 >= SWAP内存大小 + 物理内存 * N,则拒绝此次内存申请。

    2.1K40
    领券