聊聊App在安卓设备中所使用的内存

不只是mtgsig:聊聊大众点评这类生活服务App的反爬策略演进与应对思路 本文深入解析了大众点评等生活服务类App的反爬策略演进,从早期的mtgsig参数加密到现代的多维防御体系。文章详细介绍了JS逆向技术在应对这些策略中的应用,以及平台如何通过行为模式分析和设备指纹验证来提升风控效果。 阅读详情

文章用来记录及分享本人对安卓程序中内存使用的个人见解,如有不同见解 不吝赐教。

先简单浏览下面代码,看看对它们是否熟悉👇

               val activityManager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
                // Java 堆内存信息
                val runtime = Runtime.getRuntime()
                val usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024
                val maxMemory = runtime.maxMemory() / 1024 / 1024

                //todo Native内存和Java(Dalvik/ART)内存是分开的

                val memoryInfo = ActivityManager.MemoryInfo()
                activityManager.getMemoryInfo(memoryInfo)

                // 获取系统内存信息
                // 获取应用最大可使用内存,标准模式和大内存模式

                //应用在Dalvik/ART虚拟机中可以分配的最大内存。
                val memoryClassMb = activityManager.memoryClass

                //用于那些需要更多内存的应用,表示在大内存设备上应用可以使用的内存预算。
                val largeMemoryClassMb = activityManager.largeMemoryClass

                //系统总内存
                val totalMemoryMb = memoryInfo.totalMem / 1024 / 1024
                //系统可用内存
                val availMemoryMb = memoryInfo.availMem / 1024 / 1024
                //系统已用内存
                val usedMemoryMb = totalMemoryMb - availMemoryMb

                val lowMemory = memoryInfo.lowMemory

                Log.d(TAG, "系统总内存: $totalMemoryMb MB \n" +
                        "系统可用内存: $availMemoryMb MB\n" +
                        "系统已用内存: $usedMemoryMb MB\n" +
                        "应用最大可使用内存 (标准模式): ${memoryClassMb}MB\n" +
                        "应用最大可使用内存 (大内存模式): ${largeMemoryClassMb}MB")


                val debugMemoryInfo : Debug.MemoryInfo = Debug.MemoryInfo()
                Debug.getMemoryInfo(debugMemoryInfo)

                //当前程序的总内存使用量(以 MB 为单位)(包括 Java 堆、Native 堆以及其他内存使用,整个进程的总内存使用)
                val totalPssMb = debugMemoryInfo.totalPss.toLong() / 1024

                // 当前进程在 native 层可用的总堆内存大小(以 MB 为单位)
                val nativeHeapSize: Long = Debug.getNativeHeapSize() / 1024 / 1024

                //当进程中native层中已使用堆内存(以 MB 为单位)
                val useNative : Long = Debug.getNativeHeapAllocatedSize() / 1024 / 1024

                //当前进程中native层中剩余的堆内存(以 MB 为单位)
                val freeNative = Debug.getNativeHeapFreeSize() / 1024 / 1024


                // 计算当前应用剩余可用的内存
                val maxMemoryClassMb = if (largeMemoryClassMb > memoryClassMb) largeMemoryClassMb else memoryClassMb
                val remainingMemoryMb = maxMemoryClassMb - totalPssMb

                // 检查是否接近内存上限
                val isMemoryLow = usedMemory > maxMemory * 0.8 || useNative > nativeHeapSize * 0.8 || lowMemory

在开发安卓应用时,内存管理一直是一个关键的考虑因素。良好的内存管理不仅可以提高应用的性能,还能避免内存泄漏和崩溃,由于项目所需,特来恶补相关知识。

1. Java 堆内存

Java 堆内存是 JVM 分配给应用的内存,主要用于分配对象。通过 Runtime.getRuntime() 可以获取和管理 JVM 的堆内存信息。

val runtime = Runtime.getRuntime()
val usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024
val maxMemory = runtime.maxMemory() / 1024 / 1024
  • 已用内存(usedMemory):当前应用已经使用的堆内存。
  • 最大内存(maxMemory):JVM 能够使用的最大内存。

注意事项

  • 避免内存泄漏:确保不再使用的对象能及时被垃圾回收,避免持有不必要的引用。
  • 合理分配内存:尽量减少大对象的使用,优化数据结构以节省内存。

2. 系统内存

系统内存是整个设备的内存,包括所有运行的应用和系统服务。通过 ActivityManager可以获取设备的系统内存信息。

val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)

val totalMemoryMb = memoryInfo.totalMem / 1024 / 1024
val availMemoryMb = memoryInfo.availMem / 1024 / 1024
val usedMemoryMb = totalMemoryMb - availMemoryMb
val lowMemory = memoryInfo.lowMemory
  • 系统总内存(totalMemoryMb):设备的总内存。
  • 系统可用内存(availMemoryMb):设备当前可用的内存。
  • 系统已用内存(usedMemoryMb):设备当前已使用的内存。
  • 低内存标志(lowMemory):系统是否处于低内存状态。

注意事项

  • 在低内存状态下,系统可能会回收后台应用的内存以确保前台应用正常运行。开发者应适当释放资源,避免应用被系统强制终止。

3. 应用内存配额

安卓系统对每个应用分配了内存配额,标准模式和大内存模式下的内存配额有所不同。

val memoryClassMb = activityManager.memoryClass
val largeMemoryClassMb = activityManager.largeMemoryClass
  • 标准模式内存配额(memoryClassMb):应用在标准模式下最大可使用的内存。
  • 大内存模式内存配额(largeMemoryClassMb):应用在大内存模式下最大可使用的内存。

注意事项

  • 合理选择内存模式:对于需要大量内存的应用,可以申请大内存模式,但要确保设备支持。

4. 进程内存信息

通过 Debug.MemoryInfo 可以获取当前进程的内存使用情况,包括 Java 堆、Native 堆以及其他类型的内存使用。

val debugMemoryInfo : Debug.MemoryInfo = Debug.MemoryInfo()
Debug.getMemoryInfo(debugMemoryInfo)

val totalPssMb = debugMemoryInfo.totalPss.toLong() / 1024
  • 总 PSS 内存(totalPssMb):当前应用进程的总内存使用量,一般程序使用内存情况就看这个数据。

5. Native 层内存

除了 Java 堆,应用还会使用 Native 层的内存。通过 Debug 类可以获取 Native 堆内存信息。

val nativeHeapSize: Long = Debug.getNativeHeapSize() / 1024 / 1024
val useNative : Long = Debug.getNativeHeapAllocatedSize() / 1024 / 1024
val freeNative = Debug.getNativeHeapFreeSize() / 1024 / 1024
  • Native 堆大小(nativeHeapSize):当前进程在 Native 层可用的总堆内存。
  • 已使用的 Native 内存(useNative):当前进程中 Native 层已使用的堆内存。
  • 剩余的 Native 内存(freeNative):当前进程中 Native 层剩余的堆内存。

注意事项

  • 避免 Native 内存泄漏:使用 C/C++ 编写的代码要特别注意内存管理,确保分配的内存在使用后能及时释放。

先写到这,后续深入了解后再继续补充
下班,端午快乐~

2024电子数据取证实战:从手机取证到恶意APP逆向分析 本文系统介绍了2024年电子数据取证实战的核心流程与技术要点。内容涵盖从安卓手机通过ADB连接与物理/逻辑提取的基础操作,到应用数据挖掘、加密容器破解,再到恶意APP逆向分析与结构化数据关联分析。文章结合实战案例,重点解析了手机取证、蓝牙MAC地址定位、数据库解密及通过逆向分析追踪数据泄露等关键技术,为一线取证人员提供了一套从数据提取到证据链构建的完整方法论。 阅读详情

相关推荐

Unity安卓游戏开发进阶:性能优化、真机调试与包体瘦身实战指南

在移动游戏开发中,性能优化与平台适配是决定产品成败的关键技术环节。其核心原理在于通过资源管理、渲染管线优化和内存控制,平衡画质表现与设备性能。掌握这些技术能显著提升游戏流畅度、降低崩溃率,并有效控制安装包体积,直接影响用户留存与下载转化率。尤其在碎片化严重的安卓平台,开发者需针对不同硬件层级进行分级适配,例如通过纹理压缩、Draw Call合批与AssetBundle等技术方案。本文聚焦Unity引擎在安卓端的实战开发,深入探讨如何利用性能分析工具(Profiler)定位瓶颈,配置图形API(如Vulkan

weixin_29014237的博客 307

android APP内存优化

出厂后,java虚拟机对单个应用的最大内存分配就确定下来了,超出这个值就会。如果要获取手机的总内存,可以使用如下方法。针对不同手机获取app内存信息,可通过。不同厂商和机型可能不一样。.单个进程能使用的最大内存为。在代码中获取可使用的最大内存。可以使用更大的内存, 即。配置使用最大内存,在。

ti_an_1989的专栏 2029

从零开始打造个性化华为ROM:工具与步骤详解

本文详细指导如何从零开始定制个性化华为手机ROM。内容涵盖解锁Bootloader、必备工具准备、官方固件解析、系统镜像深度修改(如精简预装应用、集成Magisk实现Root)以及最终刷入测试的全流程。旨在帮助用户安全、系统地打造专属系统,实现极致的个性化与性能优化。

weixin_29233333的博客 494

Android app 内存分配

在Android app的开发过程中,我们经常会遇到内存泄漏的异常,那么搞清楚每个应用程序在Android系统中最多可分配多少内存空间是十分重要的。

一个仰望天空的Man的博客 2886

android 如何分析应用的内存(五)——Android studio的LLDB

接上文lldb的工具篇的GUI部分。接下来是as的LLDB。

安仔的博客 1778

手把手教你用YOLOv5和OpenCV实现DNF全自动刷图(含自动拾取与Boss战逻辑)

本文详细介绍了如何使用YOLOv5和OpenCV构建DNF全自动刷图系统,包括环境配置、游戏画面采集、目标检测、场景导航及操作控制等核心模块。通过实战案例,帮助开发者掌握游戏自动化技术,实现自动拾取与Boss战逻辑,提升游戏效率。

weixin_42628941的博客 446

Android 应用分配的内存大小是多少

Android应用的内存限制一般被称为“堆大小限制”(heap size limit),这是每个应用可用于其内存堆的最大内存量。在较旧的Android设备上,堆限制可能小到16MB或32MB,而现代设备的堆限制通常介于128MB到512MB或更高。不同的设备,尤其是有着不同RAM大小的设备,可能会为应用分配不同的最大内存数量。并不能保证系统一定会分配更多的内存,这只是向系统表明应用可能需要更大的内存堆,而系统会根据当前的内存使用情况来决定是否批准这一请求,且这通常只在大内存的设备上有实际效果。

weixin_45681365的博客 3361

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1968

Android如何分析内存并优化

通过使用 Android Profiler、Memory Profiler 和 LeakCanary 等工具,开发者可以有效地分析和检测应用中的内存问题。结合适当的优化技巧,如避免内存泄漏、使用合适的数据结构、优化图片加载和布局等,可以显著提升应用的性能和稳定性。内存优化是一个持续的过程,定期进行内存分析和优化有助于确保应用始终高效运行。

彬_小彬的博客 1694

无人驾驶感知融合——横摆角速度的多源估计算法解析

本文深入解析了无人驾驶感知融合中的横摆角速度多源估计算法,详细介绍了轮速差法、侧向加速度法、曲率法和惯性传感器直读法四种计算方法及其优缺点。通过卡尔曼滤波实战案例,展示了多源融合算法在提升精度和稳定性方面的显著优势,并探讨了工程实践中的时间对齐、坐标系统一等关键问题。

weixin_31458015的博客 462

HyperLynx(十五)多板仿真

在对话框的“Design file#1”下拉列表中选择“B00,Mainboard”,在其下方的“Reference designators”列表中选择元器件“J1”,然后在“Designfile#2”下拉列表中选择“BO1、RAM1”,在其下方的“Refer ence designators”列表中选择元器件“J1”,单击“Insert”按钮,为这两个元器件建立互连映射。在“Assign Models”对话框中,选择“B00 Motherboard”,将“U16.B12”设置为输出。

小幽余生不加糖 5060

MLC-LLM框架在安卓设备上的模型编译与部署全流程解析

本文详细解析了如何使用MLC-LLM框架将大语言模型编译并部署到安卓设备。内容涵盖从环境准备、模型获取与量化编译,到安卓应用集成与调试的完整流程,并提供了常见问题的避坑指南,旨在帮助开发者实现端侧AI的离线部署,提升移动端AI应用的自主性与隐私性。

tgb3456789的博客 500

YOLOv11安卓端部署终极指南:从训练到NCNN移植,30分钟搞定手机实时检测!

本文详细介绍了YOLOv11模型在安卓设备上的NCNN部署全流程。主要内容包括:1) 环境配置要求(Python3.8+、PyTorch、NCNN框架等);2) COCO2017数据集准备与配置;3) 模型训练建议(使用RTX3090,50-100个epoch);4) 模型导出转换步骤(ONNX格式转换、NCNN优化);5) 安卓端实现的关键优化(快速sigmoid实现、纯C++NMS等)。项目在安卓CPU模式下可实现20FPS的稳定检测,并提供了激活函数选择、模型量化等性能调优建议。通过参考多个开源项目,

FJN110的博客 1725

Nunchaku-flux-1-dev移动端适配:探索在安卓设备上的轻量化部署方案

本文介绍了如何在星图GPU平台上自动化部署Nunchaku-flux-1-dev镜像,该镜像是基于开源FLUX.1 [dev]模型优化的文本生成图片大模型。通过该平台,开发者可以便捷地搭建AI图片生成环境,并将其应用于移动端实时图像处理、AR滤镜特效等轻量化场景,显著提升本地化AI应用的开发效率。

weixin_36282234的博客 180

旗鱼优化算法(SFO)详解:从海洋猎手到智能优化

旗鱼优化算法(SFO)是一种新型群体智能优化算法,灵感来源于旗鱼的群体捕食行为。该算法采用双种群机制,模拟旗鱼(精英个体)与沙丁鱼(普通个体)的交互过程,通过交替攻击策略实现探索与开发的平衡。核心机制包括:基于猎物密度的旗鱼位置更新、随迭代衰减的攻击力度控制、以及捕食替换机制。SFO具有参数少、全局搜索能力强等特点,在高维复杂优化问题中表现优异。算法通过模拟自然界中的群体智能行为,为解决工程优化问题提供了新思路。

qq_42212808的博客 163

智能车图像处理3-入门级分析2 ---直道冲刺

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 4308

RMBG-2.0移动端适配探索:通过Termux+Linux容器在安卓设备运行抠图服务

本文介绍了如何在星图GPU平台上自动化部署RMBG-2.0 (BiRefNet) 极速智能抠图工具镜像,实现高效的AI抠图服务。该平台简化了部署流程,用户可快速搭建环境,将这一强大的抠图模型应用于电商产品图处理、内容创作等场景,轻松移除图片背景,提升工作效率。

weixin_30299319的博客 898

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

免费又强大硬件狗狗一款软件全面解决电脑与安卓设备检测

再讲讲它的主要功能。首先是硬件概况检测,一打开首页就是“我的电脑”硬件概览,系统版本、激活状态,还有 CPU、内存、显卡这些主要硬件的核心信息全都展示出来,普通用户一看就知道自己电脑啥状态了。驱动管理功能利用先进的硬件检测技术,配合驱动之家多年的驱动数据库,能准确识别硬件并下载安装驱动程序,要是硬件因为驱动缺失识别不了,它还会自动推荐驱动下载。使用的时候,启动首页先看“我的电脑”硬件概览,再进入“我的硬件”栏目了解硬件详情,关注温度检测功能,做做跑分测试,还能用“截图保存”“导出报表”功能记录数据。

2501_90827335的博客 1427

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

安卓的图片占用内存,图片分辨率,图片适配不同屏幕的研究

首先本文主要解决以下几个问题 1.什么是DPI 什么是dp 什么是PX,什么是desity,这些干嘛用 2.一张图片在安卓中到底占多少内存, 3.为什么安卓app的res目录下要用多个文件夹存放图片,有什么作用 首先回答第一个问题: dp:安卓特殊的一种单位,是根据 ...

谢伟光的博客 1370

深入解析跨进程内存读写:从游戏修改器到系统安全机制

内存读写是计算机系统中进程间通信与数据交互的基础技术之一,其核心原理在于操作系统通过虚拟内存机制为每个进程提供独立的地址空间,实现进程隔离以保障系统安全。从技术实现层面看,无论是Windows平台的ReadProcessMemory/WriteProcessMemory API,还是Linux/Android系统的/proc文件系统与ptrace机制,都体现了操作系统对内存访问权限的精细控制。这项技术的工程价值不仅体现在调试器、性能剖析工具等开发场景,也是理解系统安全机制的关键。在应用层面,内存读写技术常被

weixin_33834628的博客 396

为什么打印机打印照片模糊_打印照片就这么简单,小米米家照片打印机1S体验...

记得我小时候拍照片和冲洗照片都要去照相馆,即使在科技发达的现代社会,照相馆仍然坚守着自己的使命。对我个人而言证件照还是需要照相馆来帮忙拍照冲洗。不过有些照片打印出来才更有意义,自从有了米家照片打印机,生活又多几番滋味。 如今小米米家照片打印机1S上市,在上一代的基础上升级直连功能,两种照片尺寸,手机即拍即印,照片想印就印。我们一起来体验一下小米米家照片打印机1S带来的幸福感。看看米家照片打印机1S...

weixin_42648844的博客 2581

Windows安装APK不再依赖模拟器:3步上手免费的APK安装器

> 这篇 APK 安装器使用教程,写给所有想在电脑上直接安装安卓应用的新手。文章先从一个真实场景说起,再给出 3 步速成路线,带你完整走一遍安装演示,最后附上避坑要点和项目背景。全程不用写代码,跟着点鼠标就能跑通。 ## 一个 APK 文件引发的深夜折腾 晚上十点,你终于在一个论坛里找到了心心念念的那款安卓应用,帖子下方却只有一个孤零零的 APK 安装包链接。下载倒是很快,真正让人头疼的在后头

gitblog_00220的博客 379

Z-Image-Turbo_Sugar脸部Lora跨平台部署:从Windows到Android的适配实践

本文介绍了在星图GPU平台上自动化部署Z-Image-Turbo_Sugar脸部Lora镜像的实践。该平台简化了部署流程,用户可快速搭建环境,利用该镜像生成具有糖系甜美风格的定制化人脸图片,适用于移动端轻量级AI艺术创作等场景。

weixin_35189483的博客 49

漫画脸描述生成在移动端的优化部署方案

本文介绍了如何在星图GPU平台上自动化部署漫画脸描述生成镜像,实现移动端AI漫画风格转换功能。通过该平台,开发者可快速搭建优化后的轻量化模型,应用于手机App中的实时图片动漫化处理,显著提升用户体验和生成效率。

weixin_29476595的博客 313
上一篇: 在Android中使用 MQTT 服务实现消息通信
下一篇: Android Room数据库使用介绍
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值