美文网首页
Android 匿名内存

Android 匿名内存

作者: 雪国落叶 | 来源:发表于2019-11-15 11:09 被阅读0次

背景需求:

需要开辟一块大内存,但是内存超出app内存限制。

背景知识:

dalvik:是指dalvik所使用的内存。 

native:是被native堆使用的内存。应该指使用C\C++在堆上分配的内存。 

other:是指除dalvik和native使用的内存。但是具体是指什么呢?至少包括在C\C++分配的非堆内存,比如分配在栈上的内存。Gpu占用内存puzlle! 

Pss:它是把共享内存根据一定比例分摊到共享它的各个进程来计算所得到进程使用内存。网上又说是比例分配共享库占用的内存,也就是上面所说的进程共享问题。 

PrivateDirty:它是指非共享的,又不能换页出去(can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使你的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。 

SharedDirty:参照PrivateDirty我认为它应该是指共享的,又不能换页出去(can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使所有共享它的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。

VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

native heap的增长并不受dalvik vm heapsize的限制,只要RAM有剩余空间,程序员可以一直在native heap上申请空间,当然如果 RAM快耗尽,memory killer会杀进程释放RAM。大家使用一些软件时,有时候会闪退,就可能是软件在native层申请了比较多的内存导致的。

查看内存:

app堆内存

解决方案

1. 通过jni 申请 native 内存

2. 申请匿名内存

评估方式

通过 adb shell dumpsys meminfo ${packageName} 

注意事项

调用malloc 函数: malloc(1024 * 1024 * 1);   申请1M内存, 但是实际上增加4k, 一个page 大小; 原因:malloc不是申请多少内存,就分配多少,而是先分配一个page。

使用Binder在进程间传递数据的时候,有时候会抛出TransactionTooLargeException这个异常,这个异常的产生是因为Binder驱动对内存的限制引起的。也就是说,我们不能通过Binder传递太大的数据。官方文档里有说明,最大通常限制为1M

https://developer.android.com/reference/android/os/TransactionTooLargeException.html

Ashmem(Android匿名共享内存),这部分内存类似于Native内存区,但是它是受Android系统底层管理的,当Android系统内存不足时,会回收Ashmem区域中状态是 unpin 的对象内存块,如果不希望对象被回收,可以通过 pin 来保护一个对象

参考网址:

https://juejin.im/post/5b7820b86fb9a019d9245bd5

相关文章

  • 8.31

    Android匿名共享(Ashmen)Android特有内存共享机制,实现了进程间的内存共享。基于ashmen设备...

  • Android窗口管理分析(4):Android View绘制内

    前文Android匿名共享内存(Ashmem)原理分析了匿名共享内存,它最主要的作用就是View视图绘制,Andr...

  • Android 匿名内存

    背景需求: 需要开辟一块大内存,但是内存超出app内存限制。 背景知识: dalvik:是指dalvik所使用的内...

  • Android匿名共享内存(Ashmem)

    Android匿名共享内存 在Android中我们熟知的IPC方式有Socket、文件、ContentProvid...

  • Android 匿名内存解析

    Android 匿名内存解析 有了binder机制为什么还需要匿名内存来实现IPC呢?我觉得很大的原因就是bind...

  • Android匿名共享内存

    在开发中,如果在Binder传输传输比较大的数据,会报TransactionTooLargeException错误...

  • android匿名共享内存Ashmem(c库接口)

    Ashmem Android系统的匿名共享内存Ashmem驱动程序利用了Linux的共享内存子系统导出的接口来实现...

  • 匿名内存

    有时候我们在看文档的过程中, 会遇到 匿名内存 这个词 要理解匿名内存,就必须了解计算机的内存,计算机中的内存,分...

  • Android匿名共享内存(Ashmem)原理

    阅读之前,不妨先思考一个问题,在Android系统中,APP端View视图的数据是如何传递SurfaceFling...

  • Android内存泄漏(二):匿名类

    上一节已经介绍了内存泄漏与引用的关系,那么这一节强化一下,看看匿名类跟内存泄漏和引用又存在着什么样的关系呢。 匿名...

网友评论

      本文标题:Android 匿名内存

      本文链接:https://www.haomeiwen.com/subject/mnwclctx.html