android性能优化和内存优化,安卓运存优化

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windowsandroid手机版下载,windowsandroid安装apk
  • windowsandroid手机版下载,windowsandroid安装apk,WindowsAndroid 安装教程详解
  • android调用webview方法,androidwebview是什么,Android 中 WebView 的基本用法详解
  • android传感器高级编程,Android传感器,Android编程之光线传感器用法详解
  • android.app.Dialog,android自定义dialog对话框,Android开发笔记之-Dialog的使用详解
  • android 图片视频轮播框架,androidlayout轮播图,Android实现炫酷轮播图效果
  • android里的viewpager,安卓自定义view流程,Android自定义引导玩转ViewPager的方法详解
  • android里的viewpager,android viewpager详解
  • android里的viewpager,android viewpager详解,Android自定义超级炫酷的ViewPage指示器
  • android调用webview方法,androidwebview是什么
  • android设置控件宽度,android获取屏幕宽度和高度
  • android设置控件宽度,android获取屏幕宽度和高度,Android中获取控件宽高的4种方法集合
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程,android蓝牙简单开发示例教程
  • android菜单栏,android菜单控件
  • 留言与评论(共有 条评论)
       
    验证码: