当前位置:首页 » 安卓系统 » android内存限制

android内存限制

发布时间: 2022-05-21 14:01:15

㈠ 安卓的内存占用

相信不少朋友有这样的疑问,为什么手机4GB运行内存还卡?这到底应该谁背锅?看完这篇文章你就懂了。

2018年,主流品牌的旗舰机运行内存都飙升至了6GB,比如小米MIX2S、荣耀10,甚至连千元机的魅蓝E3也都全系标配6GB运行内存。这一配置升级的背后,反映了手机运行内存占用越来越大。

此前,Android系统的占用不过500MB左右,到现在Android 8.1,系统占用已经达到接近2GB;又比如微信,从一开始的30MB左右,如今已经达到220MB+的运行内存占用了。折算下来,4GB手机平均能常驻后台6个APP,相对而言有些捉襟见肘。因此,现在手机厂商纷纷将运行内存提升至6GB,这样能保证平均常驻大概11个后台。

那么,为什么APP要占用越来越多的运行内存呢?

首先,我们要站在开发者的角度来想。开发者和用户的思维不一样,他们不是努力的想要节省运行内存,而是想着如何利用更多的运行内存,以带来更流畅的体验——这么多运行内存,不用白不用,浪费太可惜。

结果,APP的运行内存占用就越来越大,这也使得常驻后台的APP数量不断减少。而为了给用户带来更流畅的体验,手机厂商们不得不把运行内存不断做大,从1GB到2GB,再到4GB、6GB、8GB。

然而,这又让开发者眼睛都亮了——正愁着怎么在运行内存和运行流畅度上进行平衡,没想到厂商那么好心,直接把运行内存做大了。于是开发者们又开启新一轮的运行内存占用了。

好了,单个APP为什么运行内存占用越来越大,你理解了吗?

但还有个问题,卡顿。有时候,明明只打开了一个APP,却还是有点卡的感觉。于是你就产生了“4GB、6GB运行内存不够用,安卓机必须上顶配”的感觉。那这个问题又要谁背锅呢?

这就要说到整个国内安卓生态了。笔者用的是Pixel 2,运行的是最纯净的Android系统。一段时间的使用下来,笔者印象最深刻的是国内APP的流氓程度,如果不用黑域进行限制,几乎分分钟就爆满运行内存了。

下面这张图,是笔者取消了黑域限制的后果。清空后台之后,隔了一段时间再看,启动了一堆APP,几乎都是国内APP。有些APP以前基本不打开,比如高德地图、京东,自启动情况非常严重。

所以,表面上你打开的是一个APP,其实背后已经运行了无数个APP。这样的情况下,想要不卡顿几乎是不可能的。值得一提的是,这些国内APP几乎都是从Google Play下载的(QQ被Google Play下架),显然流氓并不因审查机制的不同而不同。

这个锅到底谁背?开发者显然已经不是重点了,而是企业的态度问题。常驻后台,APP可以调用更多权限,记录用户更多的信息,并推送广告、消息。但问题是,比如地图APP的使用频率低,它那么积极的常驻后台是为何?对不起,笔者真的只能想到广告。

㈡ Android中如何防止内存溢出(摘)

但是Android采用的是java语言编写,所以在很大程度上,Android的内存机制等同于Java的内存机制,在刚开始开发的时候,内存的限制问题会给我们带来内存溢出等严重问题。在我们不使用一些内存的时候,我们要尽量在Android或者其他平台上避免在运行其他程序时,保存必要的状态,使得一些死进程所带来的内存问题,应该尽量在关闭程序或者保存状态的时候释放掉,这样能提高系统在运行方面的流畅性。Android的内存主要表现在:1. 在Android平台上,长期保持一些资源的引用,造成一些内存不能释放,带来的内存泄露问题很多。比如:Context(下文中提到的Activity都是Context),在一些你需要保持你的首个类对象状态,并且把状态传入其他类对象中时,这样消除掉首个类对象之前,你必须先把接收类对象释放掉。需要注意一点的是:因为在Java或者Android内存机制中,顶点的结点释放前必须保证其他对象没有调用才能被系统GC回收释放。我们来看一段代码: @Override protected void onCreate(Bundle state) { super.onCreate(state); TextViewlabel = new TextView(this); label.setText("Leaksare bad"); setContentView(label); }这个代码的意思就是我们把一个TextView的实例加载到了我们正在运行的Activity(Context)当中,因此,通过GC回收机制,我们知道,要释放Context,就必须先释放掉引用他的一些对象。如果没有,那在要释放Context的时候,你会发现会有大量的内存溢出。所以在你不小心的情况下内存溢出是一件非常容易的事情。 保存一些对象时,同时也会造成内存泄露。最简单的比如说位图(Bitmap),比如说:在屏幕旋转时,会破坏当前保持的一个Activity状态,并且重新申请生成新的Activity,直到新的Activity状态被保存。我们再看一段代码: privatestatic Drawable sBackground; @Override protected void onCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText("Leaks are bad"); if (sBackground == null) { sBackground =getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground); setContentView(label); } 这个代码是非常快的同时也是错误的。它的内存泄露很容易出在屏幕转移的方向上。虽然我们会发现没有显示的保存Context这个实例,但是当我们把绘制的图连接到一个视图的时候,Drawable就会将被View设置为回调,这就说明,在上述的代码中,其实在绘制TextView到活动中的时候,我们已经引用到了这个Activity。链接情况可以表现为:Drawable->TextView->Context。所以在想要释放Context的时候,其实还是保存在内存中,并没有得到释放。如何避免这种情况:主要在于。线程最容易出错。大家不要小看线程,在Android里面线程最容易造成内存泄露。线程产生内存泄露的主要原因在于线程生命周期的不可控。下面有一段代码:publicclass MyTest extends Activity { @Override publicvoid onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new MyThread().start(); } privateclass MyThread extends Thread{ @Override public void run() { super.run(); //do somthing } } } 代码很简单,但是在Android上又来新问题了,当我们在切换视图屏幕的时候(横竖屏),就会重新建立横屏或者竖屏的Activity。我们形象的认为之前建立的Activity会被回收,但是事实如何呢?Java机制不会给你同样的感受,在我们释放Activity之前,因为run函数没有结束,这样MyThread并没有销毁,因此引用它的Activity(Mytest)也有没有被销毁,因此也带来的内存泄露问题。有些人喜欢用Android提供的AsyncTask,但事实上AsyncTask的问题更加严重,Thread只有在run函数不结束时才出现这种内存泄露问题,然而AsyncTask内部的实现机制是运用了ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题。线程问题的改进方式主要有:(1) 将线程的内部类,改为静态内部类。(2) 在程序中尽量采用弱引用保存Context。 2. BitmapBitmap是一个很万恶的对象,对于一个内存对象,如果该对象所占内存过大,在超出了系统的内存限制时候,内存泄露问题就很明显了。。解决bitmap主要是要解决在内存尽量不保存它或者使得采样率变小。在很多场合下,因为我们的图片像素很高,而对于手机屏幕尺寸来说我们并不用那么高像素比例的图片来加载时,我们就可以先把图片的采样率降低在做原来的UI操作。如果在我们不需要保存bitmap对象的引用时候,我们还可以用软引用来做替换。具体的实例代码google上面也有很多。综上所述,要避免内存泄露,主要要遵循以下几点:第一:不要为Context长期保存引用(要引用Context就要使得引用对象和它本身的生命周期保持一致)。第二:如果要使用到Context,尽量使用ApplicationContext去代替Context,因为ApplicationContext的生命周期较长,引用情况下不会造成内存泄露问题。第三:在你不控制对象的生命周期的情况下避免在你的Activity中使用static变量。尽量使用WeakReference去代替一个static。 A obj = new A(); WeakReference wr = new WeakReference(obj); obj = null; 这是一个简单的弱引用的例子,简单来说就是回收那些NULL值对象所占的内存空间。 java与C系列语言不同之一就是内存操作都是由后台进行的,其中System.gc()方法可以回收内存。 比如你使用了一个BITMAP,在使用之后马上让它的值为NULL,这个BITMAP用过的内存就会被gc回收(也可以直接加上System.gc()快速回收),从而达到利用弱引用来缓解内存溢出的目的。 )第四:垃圾回收器并不保证能准确回收内存,这样在使用自己需要的内容时,主要生命周期和及时释放掉不需要的对象。尽量在Activity的生命周期结束时,在onDestroy中把我们做引用的其他对象做释放,比如:cursor.close()。 其实我们可以在很多方面使用更少的代码去完成程序。比如:我们可以多的使用9patch图片等。有很多细节地方都可以值得我们去发现、挖掘更多的内存问题。

㈢ 目前的安卓手机的运行内存(RAM)最大是多少

最大的4g,但系统要占大约五百兆,所以大概3.5g

㈣ android系统严格规定了每个应用所能分配的最大的内存为多少

Android应用程序的默认最大内存值为16M,不同的手机版本和型号有所不同(我的三星galaxy s3的是256M)

Android应用程序的默认最大内存值

有些应用程序可能会出现内存溢出,譬如:

ERROR/AndroidRuntime(264): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

除了要检查修正代码之外,还可以考虑修改Android应用程序的默认最大内存值。

㈤ android系统需要多大内存

手机内存的话至少1G!
低配置的可以root,然后用冰雪 冻结不使用的app,一样玩的很6,
开发android的话,电脑最好8G以上,条件允许就上SSD硬盘,
编译代码和开虚拟机,非常耗内存和CPU。

㈥ 一个android应用在内存中占用多少内存

在Android中,一个Process 只能使用16M内存,如果超过了这个限制就会抛出Android Out Of Memory(OOM) 这个异常。 在Android中: 1.一个进程的内存可以由2个部分组成:java 使用内存 ,C 使用内存 ,这两个内存的和必须小于16M,不然就会出现OOM...

安卓系统对内存的需求大小

Android对于内存的要求是越大越好,2000左右的RAM一般都是512M,机子因为是照相所以我推荐
索爱
的。

㈧ android系统运行需要多大内存

安卓手机我用过好多,从最早的256M到512M到1G到2G,个人感觉还是2G运行内存的不影响使用,1G的还凑和,再少的话,就非常差了。

㈨ 如何突破24M内存的限制,为Android程序分配到更多内存

一个Android的应用最多使用16M的内存,如果要突破这个限制,则要使用c/c++编写JNI,即直接调用底层的函数来处理.linux也是用c/c++来编写的,因此有非常非常多的函数库可以调用.

热点内容
python查看进程 发布:2024-05-19 22:59:37 浏览:158
androidhtml颜色 发布:2024-05-19 22:58:34 浏览:847
米3系统存储和内存设备 发布:2024-05-19 22:50:50 浏览:214
途乐有哪些越野配置 发布:2024-05-19 22:49:53 浏览:673
php检测变量 发布:2024-05-19 22:45:31 浏览:322
结构与算法 发布:2024-05-19 22:32:22 浏览:588
ubuntuphp版本 发布:2024-05-19 21:59:12 浏览:929
解压文案馆 发布:2024-05-19 21:58:54 浏览:871
苏宁访问数 发布:2024-05-19 21:53:49 浏览:581
湿地下载ftp 发布:2024-05-19 21:46:10 浏览:487