打印Android程序所占内存
android anr中的memoryinfo日志

android anr中的memoryinfo日志Android应用程序在运行过程中,可能会遇到各种问题,其中之一是ANR(Application Not Responding)错误。
ANR错误表示应用在特定的时间段内未响应用户输入,这给用户带来了不好的用户体验。
在分析ANR错误时,我们可以通过查看MemoryInfo日志来获取有关应用程序内存使用情况的详细信息,这对于定位和解决问题非常有帮助。
MemoryInfo日志是一种Android系统提供的日志记录机制,用于跟踪应用程序的内存使用情况。
它包含了一系列与内存相关的指标和统计数据,让开发者能够了解应用程序在特定时间段内使用的内存数量、内存分配情况、内存泄漏等。
通过这些信息,开发者可以更好地了解应用程序在ANR错误发生前后,内存的变化情况,从而帮助他们定位问题。
MemoryInfo日志通常包含以下几个重要的部分:1. "Total PSS by category":该部分提供了不同的内存类别,如Java Heap、Native Heap、Code、Stack、Graphics等的总PSS (Proportional Set Size)。
PSS是一种根据内存使用的公平度进行分配的指标,它表示了一个进程所占用的内存的一部分,因此,通过查看不同内存类别的PSS,开发者可以了解到应用程序的不同组件的内存使用情况,进而推测出可能存在的问题。
2. "Total RAM":该部分提供了应用程序占用的总内存大小,通常以MB为单位。
开发者可以通过查看此部分来了解应用程序使用的总内存量,从而评估其内存占用情况是否偏高。
3. "Summary":该部分提供了应用程序的一些总体统计信息,如应用程序的总PSS、Java Heap大小、Native Heap大小等。
通过查看此部分,开发者可以快速了解应用程序的整体内存使用情况。
Android应用性能测试从CPU到内存全方位分析

Android应用性能测试从CPU到内存全方位分析在进行Android应用性能测试时,从CPU到内存的全方位分析是非常重要的。
这种分析可以帮助开发者确定应用程序的性能瓶颈,并优化其性能,以提供更好的用户体验。
本文将探讨如何进行Android应用性能测试,并针对性能测试的各个方面进行详细分析。
一、CPU性能测试1.1 硬件环境准备在进行CPU性能测试之前,需要提前准备好测试环境。
首先,确保使用一台配置较高的Android手机或使用模拟器。
其次,关闭所有后台运行的应用程序,以确保测试结果的准确性。
1.2 测试工具选择Android平台上有许多可用于测试CPU性能的工具,比如AnTuTu Benchmark、Geekbench等。
开发者可以根据实际需求选择合适的工具。
1.3 测试指标及结果分析在进行CPU性能测试时,开发者需要关注以下指标:- 单核性能:测试设备在单核处理器上的性能表现。
- 多核性能:测试设备在多核处理器上的性能表现。
- CPU温度:测试设备在高负载情况下的温度表现。
通过测试工具运行测试后,开发者可以根据得到的结果进行分析和优化。
比如,如果单核性能较低,可以考虑优化应用程序的算法或减少不必要的计算过程。
二、内存性能测试2.1 内存使用监测在进行内存性能测试之前,首先需要监测应用程序的内存使用情况。
Android平台提供了内存监测工具,如Android Profiler等。
通过监测内存使用,可以了解应用程序的内存占用情况,并找出可能存在的内存泄漏问题。
2.2 内存泄漏检测内存泄漏是Android应用开发中常见的问题之一。
为了检测内存泄漏,开发者可以使用Profiling工具来分析应用程序的堆转储文件。
通过分析堆转储文件,可以找出那些没有被垃圾回收器释放的对象,从而确定是否存在内存泄漏问题。
2.3 内存优化根据内存性能测试的结果,开发者可以进行相应的优化。
比如,可以优化应用程序的内存管理策略,减少不必要的内存占用。
Android的原理:关于应用自启动,占内存那些问题

Android的原理-不需要太多的剩余内存Android用RAM的方式,跟windows、WM、Sybiam是两回事。
在Android里,RAM被用满了是件好事。
它意味着你可以快速打开之前打开的软件,回到之前的位置。
所以Android 很有效的使用RAM,很多用户看到他们的RAM满了,就认为拖慢了他们的手机。
而实际上,退出后重启这些程序才真正拖慢了手机的响应。
而且这些自动杀进程的软件本身是个时刻活跃的进程,它始终在后台保持活跃使得CPU难以消停,反而增加了耗电量。
不用在意剩余内存的大小.其实很多人都是把使用其他系统的习惯带过来来了.安卓Android大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制有关系.如果你知道java,就能更清楚这机制了.其实和java的垃圾回收机制类似,系统有一个规则来回收内存.进行内存调度有个阀值,只有低于这个值系统才会按一个列表来关闭用户不需要的东西.当然这个值默认设置得很小,所以你会看到内存老在很少的数值徘徊.但事实上他并不影响速度.相反加快了下次启动应用的速度.这本来就是安卓Android标榜的优势之一,如果人为去关闭进程,没有太大必要.特别是自动关进程的软件.到这里有人会说了,那为什么内存少的时候运行大型程序会慢呢?其实很简单,在内存剩余不多时打开大型程序,会触发系统自身的调进程调度策略,这是十分消耗系统资源的操作,特别是在一个程序频繁向系统申请内存的时候.这种情况下系统并不会关闭所有打开的进程,而是选择性关闭,频繁的调度自然会拖慢系统.所以,论坛上有个更改内存阀值的程序可以有一定改善. 但改动也可能带来一些问题,取决于值的设定.那么,进程管理软件有无必要呢?有的.就是在运行大型程序之前,你可以手动关闭一些进程释放内存,可以显著的提高运行速度.但一些小程序,完全可交由系统自己管理.谈到这里,可能有的朋友会问,如果不关程序是不是会更耗电.我就说说安卓Android后台的原理,你就明白了.安卓Android 的应用在被切换到后台时,它其实已经被暂停了,并不会消耗cpu资源,只保留了运行状态.所以为什么有的程序切出去重进会到主界面.但是,一个程序如果想要在后台处理些东西,如音乐播放,它就会开启一个服务.服务可在后台持续运行,所以在后台耗电的也只有带服务的应用了.这个在进程管理软件里能看到,标签是service.所以没有带服务的应用在后台是完全不耗电的,没有必要关闭.这种设计本来就是一个非常好的设计,下次启动程序时,会更快,因为不需要读取界面资源,何必要关掉他们抹杀这个安卓Android的优点呢?还有一个.为什么安卓Android一个应用看起来那么耗内存.大家知道,安卓Android上的应用是java,当然需要虚拟机,而安卓Android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机.这样设计的原因是可以避免虚拟机崩溃导致整个系统崩溃,但代价就是需要更多内存.以上这些设计确保了安卓Android的稳定性,正常情况下最多单个程序崩溃,但整个系统不会崩溃,也永远没有内存不足的提示出现.大家可能是被windows毒害得太深了,总想保留更多的内存,但实际上这并不一定会提升速度,相反却丧失了程序启动快的这一系统特色,很没必要.至于为什么开了大程序或者开了好几个程序之后切换会变慢,我的理解如下:1.大程序A已经开启,占用70%内存,如果再想运行一个B,需要50%的内存,则就需要一个将A 从内存中释放或者压缩的过程,所以表现出来的就是慢一会儿2.A\B\C\D\E共占用内存80%,运行新程序Z需要 20%的内存,系统内存因为没见过剩余0的时候,也就是应该剩一部分空闲内存,那么就需要从A~E这几个程序中选择一个或者几个来关闭,这一过程也需要耗费系统资源,所以会慢一会儿3.也就是说你手动去杀程序的时候,就是替系统在释放内存,就算你不杀,在需要内存的时候系统也会自动释放.4.不在后台运行的程序(没服务的),即使不杀也不会耗电.在后台运行的(有服务的)程序,如后台放歌,当然会耗电.5,以qq举例,正常的退,会在进程管理里留下qq的运行状态,但不耗电不占 cpu,如果你只是切换出去(按小房子而不是退出)那么自然会耗电,因为程序还在运行.Android将进程分为六大类:1.前台进程(foreground):目前正在屏幕上显示的进程和一些系统进程。
android anr中的memoryinfo日志 -回复

android anr中的memoryinfo日志-回复什么是ANR?ANR(Application Not Responding)是Android系统中的一种错误,它指的是应用程序在特定情况下无法响应用户的输入或无法完成一项任务而导致系统强制关闭该应用程序的情况。
ANR的成因有很多,可能是由于执行耗时操作、主线程阻塞、内存不足或死锁等问题导致。
其中,内存不足是Android系统中常见的ANR问题。
内存不足是如何引发ANR问题的?Android系统给每个应用程序分配了内存,用于存储应用程序的数据、函数和资源。
当应用程序使用的内存超过了系统可用的内存空间时,就会发生内存不足的情况。
当应用程序需要分配更多内存来处理任务时,系统会尝试从已经分配给其他应用程序但当前未使用的内存中获取一部分内存。
然而,如果这部分内存不足以满足应用程序的需求,那么即会引发内存不足的错误。
内存不足会导致ANR问题的发生,因为应用程序将无法正常运行,无法响应用户的输入或完成一项任务。
此时,系统会认为应用程序无响应,并强制关闭该应用程序,以确保系统的稳定性。
如何查看ANR中的MemoryInfo日志?ANR问题在开发过程中很常见,因此Android系统提供了一种详细记录ANR事件的机制。
其中,MemoryInfo日志是一项重要的记录,它帮助开发者分析和解决内存不足导致的ANR问题。
要查看ANR中的MemoryInfo日志,需要进行以下步骤:步骤1:通过ADB连接设备首先,需要使用Android Debug Bridge(ADB)工具连接Android设备到开发者电脑上。
可以通过USB连接或者局域网连接来实现。
步骤2:打开Logcat在开发者电脑上,打开终端或命令行窗口,并输入以下命令:adb logcat这将启动Logcat工具,它会获取Android设备上的系统日志和应用程序日志。
步骤3:筛选MemoryInfo日志使用Logcat工具可以看到大量的日志信息,包括各种系统和应用程序的记录。
Android测试如何进行内存和性能优化

Android测试如何进行内存和性能优化Android应用程序的内存和性能优化是保证应用程序正常运行和提高用户体验的重要步骤。
本文将探讨Android测试的一些方法和工具,以帮助开发人员进行内存和性能优化。
一、内存优化测试1. 内存泄漏测试内存泄漏是指应用程序在不再使用一些对象时,没有正确释放它们所占用的内存。
通过以下步骤进行内存泄漏测试:- 使用Android的内存分析工具,如Android Profiler,检测内存泄漏问题。
- 使用内存监控工具,如LeakCanary,检测对象的生命周期是否正确管理。
2. 内存占用测试测试应用程序在不同场景下的内存占用情况,以便及时发现和解决内存问题。
可以使用以下方法进行测试:- 使用Android Profiler等工具,监测应用程序的内存占用情况。
- 测试不同设备上应用程序的内存占用情况,以确保应用程序在各种设备上都能正常运行。
二、性能优化测试1. 响应时间测试测试应用程序的响应时间,以确保用户在使用应用程序时能够得到良好的体验。
以下是一些测试方法:- 使用性能测试工具,如JMeter,对应用程序进行负载测试,模拟多用户同时访问应用程序的情况,以评估应用程序的响应速度。
- 测试应用程序在不同网络条件下的响应时间,以确保应用程序在各种网络环境下都能提供良好的用户体验。
2. CPU利用率测试测试应用程序的CPU利用率,以评估应用程序的性能。
以下是一些测试方法:- 使用性能测试工具,如MonkeyRunner,对应用程序进行压力测试,模拟大量用户同时操作应用程序,以评估应用程序的CPU利用率。
- 测试应用程序在不同设备上的CPU利用率,以确保应用程序在各种设备上都能正常运行。
3. 界面渲染性能测试测试应用程序的界面渲染性能,以确保应用程序的界面能够流畅地显示。
以下是一些测试方法:- 使用UI性能测试工具,如UI Automator,对应用程序的界面进行性能测试,评估界面渲染的速度和流畅度。
android系统信息(内存、cpu、sd卡、电量、版本)获取

要转载请注明出处:/blog/1066113,有很多转载了文章不写出处,还写的是什么小编最近做项目碰到什么问题怎么解决的的然后把文章贴下面,俨然一副他们自己的文章,不知羞耻!一、内存(ram):android的总内存大小信息存放在系统的/proc/meminfo文件里面,可以通过读取这个文件来获取这些信息:Java代码1public void getTotalMemory(){2String str1="/proc/meminfo";3String str2="";4try{5FileReader fr=new FileReader(str1);6BufferedReader localBufferedReader=new BufferedReader(fr,8192);7while((str2=localBufferedReader.readLine())!=null){8Log.i(TAG,"---"+str2);9}10}catch(IOException e){11}12}运行信息如下:Java代码1305-3008:05:14.807:INFO/-SystemInfo-(1519):---MemTotal:204876kB1405-3008:05:14.807:INFO/-SystemInfo-(1519):---MemFree: 4596kB1505-3008:05:14.807:INFO/-SystemInfo-(1519):---Buffers: 16020kB1605-3008:05:14.807:INFO/-SystemInfo-(1519):---Cached: 82508kB1705-3008:05:14.807:INFO/-SystemInfo-(1519):---SwapCached:64kB1805-3008:05:14.807:INFO/-SystemInfo-(1519):---Active: 137104kB1905-3008:05:14.807:INFO/-SystemInfo-(1519):---Inactive:41056kB2005-3008:05:14.807:INFO/-SystemInfo-(1519):---SwapTotal:65528kB2105-3008:05:14.817:INFO/-SystemInfo-(1519):---SwapFree:65368kB2205-3008:05:14.817:INFO/-SystemInfo-(1519):---Dirty: 88kB2305-3008:05:14.817:INFO/-SystemInfo-(1519):---Writeback:0kB2405-3008:05:14.817:INFO/-SystemInfo-(1519):---AnonPages:79672kB2505-3008:05:14.817:INFO/-SystemInfo-(1519):---Mapped: 38296kB2605-3008:05:14.817:INFO/-SystemInfo-(1519):---Slab: 5768kB2705-3008:05:14.817:INFO/-SystemInfo-(1519):---SReclaimable:1856kB2805-3008:05:14.827:INFO/-SystemInfo-(1519):---SUnreclaim:3912kB2905-3008:05:14.827:INFO/-SystemInfo-(1519):---PageTables:8184kB3005-3008:05:14.827:INFO/-SystemInfo-(1519):---NFS_Unstable:0kB3105-3008:05:14.827:INFO/-SystemInfo-(1519):---Bounce: 0kB3205-3008:05:14.827:INFO/-SystemInfo-(1519):---CommitLimit:167964kB3305-3008:05:14.827:INFO/-SystemInfo-(1519):---Committed_AS:11771920kB3405-3008:05:14.827:INFO/-SystemInfo-(1519):---VmallocTotal:761856kB3505-3008:05:14.827:INFO/-SystemInfo-(1519):---VmallocUsed:83656kB3605-3008:05:14.827:INFO/-SystemInfo-(1519):---VmallocChunk:674820kB第一行是总内存大小(即用户可以使用的ram的大小)!其他各项的介绍大家可以看这儿:/android-phones-to-get-the-total-memory-and -available-memory.html获取当前剩余内存(ram)大小的方法:Java代码37public long getAvailMemory(){38ActivityManager am=(ActivityManager)mContext.getSystemService(Context.ACTIV ITY_SERVICE);39ActivityManager.MemoryInfo mi=newActivityManager.MemoryInfo();40am.getMemoryInfo(mi);41return mi.availMem;42}二、Rom大小Java代码43public long[]getRomMemroy(){44long[]romInfo=new long[2];45//Total rom memory46romInfo[0]=getTotalInternalMemorySize();4748//Available rom memory49File path=Environment.getDataDirectory();50StatFs stat=new StatFs(path.getPath());51long blockSize=stat.getBlockSize();52long availableBlocks=stat.getAvailableBlocks();53romInfo[1]=blockSize*availableBlocks;54getVersion();55return romInfo;56}5758public long getTotalInternalMemorySize(){59File path=Environment.getDataDirectory();60StatFs stat=new StatFs(path.getPath());61long blockSize=stat.getBlockSize();62long totalBlocks=stat.getBlockCount();63return totalBlocks*blockSize;64}注意类型,不然相乘之后会有溢出。
Android获取App内存使用情况的方法

Android获取App内存使⽤情况的⽅法1.代码获取当前app内存的使⽤情况ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);//最⼤分配内存int memory = activityManager.getMemoryClass();System.out.println("memory: "+memory);//最⼤分配内存获取⽅法2float maxMemory = (float) (Runtime.getRuntime().maxMemory() * 1.0/ (1024 * 1024));//当前分配的总内存float totalMemory = (float) (Runtime.getRuntime().totalMemory() * 1.0/ (1024 * 1024));//剩余内存float freeMemory = (float) (Runtime.getRuntime().freeMemory() * 1.0/ (1024 * 1024));System.out.println("maxMemory: "+maxMemory);System.out.println("totalMemory: "+totalMemory);System.out.println("freeMemory: "+freeMemory);结果System.out: memory: 256System.out: maxMemory: 256.0System.out: totalMemory: 11.974937System.out: freeMemory: 3.6257935这说明我这个app在当前⼿机的最⼤分配内存是256m,现在已经分配了11m,这11m中有6m是空闲的当然通过Monitors可以更直观的查看内存使⽤情况2.使⽤dos命令(1)打开dos窗⼝,执⾏adb shell(2)dumpsys meminfo 包名结果:3.使⽤Monitors或者DDMSmonitorsDDMS以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Android系统adb命令查看CPU与内存使用率

Android系统adb命令查看CPU与内存使⽤率1. 打开终端,进⼊上述⽬录,如下图所⽰:2. 输⼊adb shell,打开adb命令⾏,如下图所⽰:3. 查看cpu使⽤情况:输⼊命令:top -m 10 -s cpu(-m显⽰最⼤数量,-s 按指定⾏排序),如下图所⽰:1. 参数含义:2. PID : progress identification,应⽤程序ID3. S : 进程的状态,其中S表⽰休眠,R表⽰正在运⾏,Z表⽰僵死状态,N表⽰该进程优先值是负数4. #THR : 程序当前所⽤的线程数5. VSS : Virtual Set Size虚拟耗⽤内存(包含共享库占⽤的内存)6. RSS : Resident Set Size实际使⽤物理内存(包含共享库占⽤的内存)7. PCY : 前台(fg)和后台(bg)进程8. UID : User Identification,⽤户⾝份ID9. Name : 应⽤程序名称(注意第⼀列的pid,使⽤pid值可以查看当前程序的内存使⽤情况。
)4. 查看指定程序内存使⽤情况:输⼊命令:dumpsys meminfo pid,⽐如查看⼿机安装的360安全卫⼠,那么实际命令应该为:dumpsys meminfo 3253,如下图所⽰:[plain]1. 参数含义:2. dalvik : dalvik使⽤的内存3. native : native堆上的内存,指C\C++堆的内存(android 3.0以后bitmap就是放在这⼉)4. other : 除了dalvik和native的内存,包含C\C++⾮堆内存······5. Pss : 该内存指将共享内存按⽐例分配到使⽤了共享内存的进程6. heap alloc : 已使⽤的内存7. heap free : 空闲的内存8. share dirty : 共享,但有不能被换页出去的内存9. private dirty : ⾮共享,⼜不能被换页出去的内存(⽐如linux系统中为了提⾼分配内存速度⽽缓冲的⼩对象,即使你的进程已经退出,该内存也不会被释放)5. 使⽤ctrl + c,退出adb命令⾏。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
打印Android程序所占内存
Android项目中内存溢出,故关注程序内存使用情况。
写了个打印内存使用情况的脚本:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class CdMemoryReader {
BufferedWriter writer;
/**
*
* @Description: TODO
* @param @param args args[0] : process name args[1]: execute time (int)
* args[2]: sleep time (long)
* @return void
* @throws @param args
* @date:2010/06/19 author:
*/
public static void main(String args[]) {
final String brower = "brower";
final String mms = "mms";
long sleeptime = 2000;
int times = 1000;
String procName = heco;
// CdMemoryReader cdMemoryReader = new CdMemoryReader() ;
System.out.println();
switch (args.length) {
default:
System.out.println("the args more than 3 is useless !");
System.out.println();
case 3:
try {
long sleepT = Long.parseLong(args[2]);
sleeptime = sleepT < 1000 ? 1000 : sleepT;
} catch (NumberFormatException e) {
System.out
.println("the args: " + args[2] + "is not a number .");
System.exit(0);
}
case 2:
try {
int exectime = Integer.parseInt(args[1]);
times = exectime <= 0 ? 1 : exectime;
} catch (NumberFormatException e) {
System.out
.println("the args: " + args[1] + "is not a number .");
System.exit(0);
}
case 1:
String name = args[0];
// 这里可以不做判断 直接使用传入的参数 我们是特定打印
if (name.contains(brower)) {
procName = brower;
} else if (name.contains(mms)) {
procName = mms;
} else {
System.out.println("the process name is wrong !!");
System.exit(0);
}
case 0:
System.out.println("proce name: " + procName);
System.out.println();
System.out.println("execute times: " + times);
System.out.println();
System.out.println("sleep time: " + sleeptime);
System.out.println();
new CdMemoryReader().cdAccess(sleeptime, times, 20, procName);
break;
}
}
private void cdAccess(long time, int times, int lines, String procName) {
Runtime rt = Runtime.getRuntime();
StringBuffer buffer = new StringBuffer();
String title = " PID Vss Rss Pss Uss cmdline";
System.out.println(title);
try {
writer = new BufferedWriter(new FileWriter(new File("D:/log.txt")));
writer.write(title + "/n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int printTime = 1;
for (int i = 0; i < times; i++) {
try {
String cmd = "adb shell procrank";
buffer.delete(0, buffer.length());
Process proc = rt.exec(cmd);
InputStream stderr = proc.getInputStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
int j = 0;
while ((line = br.readLine()) != null) {
if (j < lines) {
if (line.contains(procName)) {
System.out.println(line + " PrintTime : "
+ printTime++ + " execute time : "
+ (i + 1));
buffer.append(line + "/n");
break;
}
}
j++;
}
// buffer.append("/n");
// buffer.append("/n");
writer.write(buffer.toString());
writer.flush();
// System.out.println("buffer.toString()" + buffer.toString());
} catch (Throwable t) {
t.printStackTrace();
}
try {
Thread.sleep(time);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
日志文件默认放在D盘。
将uss的数据获取放在excel中可以生成以下的图,更直观些。
本文由麦可网/ 整理,转载请注明出处。