android性能优化和内存优化,安卓运存优化
1.安卓内存大小//正常情况下我得到的app内存大小,我的小米5s是256 M。
activiyManager.getMemoryClass()
//在android清单中的android:largeHeap=true 之后设置应用程序内存大小
activiy manager . getlargememoryclass();//单位:M完整代码:
私有void计算(){
StringBuilder StringBuilder=new StringBuilder();
activity manager activiy manager=(activity manager)getsystem service(Context。ACTIVITY _ SERVICE);
int mem class=activiy manager . getmemoryclass();//单位:米
//Application:main fest-large heap-not goog choice-在大多数设备中,没有区别。但在我的军情五处,它确实有效。
int large memclass=activiy manager . getlargememoryclass();//单位:米
stringbuilder . append( mem class: mem class \ n );
stringbuilder . append( large mem class: large mem class \ n );
info . settext(stringbuilder . tostring());
Log.d(mooc ,stringbuilder . tostring());在我的小米5s里,数据:
2.Android内存管理模式2.1 Android系统内存分配和回收模式Android的底层是Linux,开发和应用的框架层是Java。一个app通常是对应一个虚拟机的进程。
体验一下:
写下你的app的包名,我的:package com . lizi . native Android;在将应用程序部署到您的设备windows搜索字段中输入cmd,找到命令提示符,然后选择以管理员身份运行。
//输入Android底层Linux系统命令,adb需要配置环境变量。
命令行
//ps查看系统中进程的命令。根据进程列表中的包名找到自己的app进程:
其父进程:
查看有关应用程序流程的信息
//dumpsys meminfo packagename
Dumys Meminfo com。理子。原生安卓重新部署了以下物品,id也变了。请忽略它。
在操作系统为进程分配内存后,进程在应用程序中分配内存。
Dalvik HeapNative Heapapk…GC只在堆中没有足够的剩余空间时发出垃圾收集。如果没有足够的内存,申请GC回收时,GC中的对象很多,变化很大。要知道GC也会占用处理器的时间。在这种极端情况下,GC会影响你的app的响应。
当GC被触发时,所有线程都将被挂起。
2.2App内存限制机制每个App的最大内存限制因设备而异。
记忆吞噬者:图片
2.3切换应用时,后台app清理机制,Android系统通过分时复用实现多个应用同时运行。当你使用你的应用程序时,点击返回或主页,这并没有被完全破坏。只是在后台缓存,下次运行的时候直接掉出后台,所以速度非常快。
应用程序切换期间的LRU缓存
LRU算法:最近使用的最先出现,最少使用的可能被清除。
清理的时候发出OnTimeMemory()回调方法,这个方法不仅在清理的时候被回调,在系统内存发生变化的时候也会发出对应的OnTimeMemory()给每个应用。
代码:
@覆盖
内存上的公共void(int级){
super.onTrimMemory(级别);
Log.d(mooc , level: 2.4监控内存的几种方法2.4.1代码监控。getruntime()。total memory()* 1.0f/(1024 * 1024);
float free memory=runtime . get runtime()。freeMemory()* 1.0f/(1024 * 1024);
float maxMemory=runtime . get runtime()。maxMemory()* 1.0f/(1024 * 1024);
stringbuilder . append( total memory: total memory \ n );
stringbuilder . append( free memory: free memory \ n );
stringbuilder . append( maxMemory: maxMemory \ n );
25M是系统分配的内存,最大限制是512M。
2.4.2 Android监视器 Android配置文件2.4.3 Android设备监视器
点开你的app,点开Cause GC,内存大小就变了。
3.App内存优化方法数据结构优化对象复用避免内存泄露3.1数据结构优化3.1.1频繁使用StringBuilder进行字符串拼接说话便宜,给我看看代码。
private int rowLength=20
private int长度=300;
private int[][]int matrix=new int[rowLength][length];
私有Random ran=new Random();
@覆盖
受保护的void onCreate(Bundle saved instancestate){
super . oncreate(savedInstanceState);
setContentView(r . layout . activity _ main);
查找视图();
计算();
for(int I=0);我是罗伦思(一)>
for(int j=0);j长度;j .]
int matrix[I][j]=ran。nextint();
}
}
}
findViewById(R.id.starjoin).setonclicklistener(新视图)。onclicklistener()>
@覆盖
公共see onclick(查看)
Log.d(mooc , starjoin clicked!);
do join();
}
});
findViewById(R.id.starbld).setonclicklistener(新视图)。onclicklistener()>
@覆盖
公共see onclick(查看)
Log.d(mooc , starbld clicked!);
dold();
}
});
私有void dold()>
字符串生成器row str=new string builder();
Log.d(mooc , dold start:);
for(int I=0);我是罗伦思(一)>
for(int j=0);j长度;j .]
rowstr。append(int matrix[I][j]);
rowStr.append(,);
}
Log.d(mooc , dold rowstr: I );
}
Log.d(mooc , dold rowstr: rowstr。tostring().长度();
}
private void do join()>
字符串行str=;
Log.d(mooc , do join start:);
for(int I=0);我是罗伦思(一)>
for(int j=0);j长度;j .]
rowstr=rowstr int matrix[I][j];
rowStr=rowStr ,;
}
Log.d(mooc , do join row str: I );
}
Log.d(mooc , doJoin rowStr:当调用doJoin(),性能3S:
12-03 20:22:08.322 10917-10917/com丽莎。原生Android d/mooc:明星加入点击!
12-03 20:22:08.322 10917-10917/com丽莎。原生Android d/mooc:do join start:
12-03 20:22:08.334 10917-10917/com丽莎。原生Android d/mooc:do join row str:0
12-03 20:22:08 .355 10917-10917/com。丽莎。原生Android d/mooc:do join row str:1
12-03 20:22:08.406 10917-10917/com丽莎。原生Android d/mooc:do join row str:2
12-03 20:22:08.465 10917-10917/com丽莎。原生Android d/mooc:do join row str:3
12-03 20:22:08.542 10917-10917/com丽莎。原生Android d/mooc:do join row str:4
12-03 20:22:08.680 10917-10917/com丽莎。原生Android d/mooc:do join row str:5
12-03 20:22:08.794 10917-10917/com丽莎。原生Android d/mooc:do join row str:6
12-03 20:22:08 .926 10917-10917/com。丽莎。原生Android d/mooc:do join row str:7
12-03 20:22:09.060 10917-10917/com丽莎。原生Android d/mooc:do join row str:8
12-03 20:22:09 .222 10917-10917/com。丽莎。原生Android d/mooc:do join row str:9
12-03 20:22:09.427 10917-10917/com丽莎。原生Android d/mooc:do join row str:10
12-03 20:22:09.609 10917-10917/com丽莎。原生Android d/mooc:do join行str:11
12-03 20:22:09.791 10917-10917/com丽莎。原生Android d/mooc:do join行str:12
12-03 20:22:10 035 10917-10917/com。丽莎。原生Android d/mooc:do join行str:13
12-03 20:22:10.285 10917-10917/com丽莎。原生Android d/mooc:do join行str:14
12-03 20:22:10 514 10917-10917/com。丽莎。原生Android d/mooc:do join行str:15
12-03 20:22:10.781 10917-10917/com丽莎。原生Android d/mooc:do join行str:16
12-03 20:22:11.089 10917-10917/com丽莎。原生Android d/mooc:do join row str:17
12-03 20:22:11 410 10917-10917/com。丽莎。原生Android d/mooc:do join row str:18
12-03 20:22:11,801 10917-10917/com丽莎。原生Android d/mooc:do join row str:19
12-03 20:22:11,801 10917-10917/com丽莎。原生Android d/mooc:do join row str:65928
12-03 20:22:11 802 10917-10917/com。丽莎。原生Android I/编导:队长208帧!应用程序在其主要线程上可能做得太多。
12-03 20:22:26.867 10917-10917/com丽莎。原生Android d/mooc:级别:20当调用多布尔德(),性能2毫秒:
12-03 20:28:40 .110 10917-10917/com。丽莎。原生Android d/mooc:starbld点击!
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold start:
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold rowstr:0。
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold rowstr:1
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold rowstr:2
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold rowstr:3
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold rowstr:4
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold rowstr:5
12-03 20:28:40 .111 10917-10917/com。丽莎。原生Android d/mooc:dold rowstr:6
12-03 20:28:40.111 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:7
12-03 20:28:40.111 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:8
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:9
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:10
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:11
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:12
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:13
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:14
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:15
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:16
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:17
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:18
12-03 20:28:40.112 10917-10917/com . lizi . native Android D/mooc:doBld rowStr:19
12-03 20:28:40.112 10917-10917/com . lizi .原生Android D/MOOC:DOBLD ROWSTR:659283 . 1 . 2 array map和SparseArray替换HashMap内存,在使用较少数据时效率更高。这与HashMap的用法是一致的。3.1.3存储器抖动代码
private int rowLength2=10
私有int length2=420000
私有void doChurn(){
Log.d(mooc , doChurn start:);
for(int I=0;i rowLength2i ) {
//重要,变量放在这里。每次赋新的一行,这里就有新的变量,前面一行的变量就被丢弃了。乔治勋章
//优化,就把循环外面的变量放在头上,重用。
String[]str matrix=new String[length 2];
for(int j=0;j长度2;j ) {
//内存抖动原因:大量字符串占用空间-420000
str matrix[j]=string . value of(ran . next double());
}
Log.d(mooc , doChurn str matrix: I );
}
Log.d(mooc , doChurn strMatrix end:
3.1.4最小的类花费0.5 kb3.1.5 HashMap。一个条目需要占用32B3.2对象重用复用系统的额外资源。ListView/GridView的ConvertView重用避免了在onDraw方法中创建对象。3.3避免内存泄漏。由于代码缺陷,这个内存仍然被其他东西引用,这使得GC无法回收它。
内存泄漏会导致可用堆越来越少,并频繁触发GC。
4.OOM问题优化4.1 OOM问题分析Android内存有限容易出现图片OOM-=-= o . o t _ t
4.2强引用和软引用私有字符串strongRef的含义;
私有软引用字符串softRef
strong ref=string . value of(math . random());
softRef=新的SoftReference字符串(String . value of(math . random()));场景:
变量在活动中定义,生命周期与活动同步。此变量节省的内存空间在活动的生存期内不会被释放。
强引用:其内存空间在其生命周期内不会被回收。
软引用:在它的生命周期中,如果它的内存空间不够,GC可以回收它。
4.3优化OOM问题的方法注意及时恢复——清空临时位图对象。recyle()注意位图的浪费。试着捕捉一些大内存不匹配的操作。加载位图:缩放,解码格式,本地加载(解决大部分)。参考链接:https://www.imooc.com/video/13672
版权归作者所有:博主曲乐优香原创作品,转载授权请联系作者,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。