当前位置:首页 » 安卓系统 » android图片内存溢出

android图片内存溢出

发布时间: 2022-09-13 15:18:30

Ⅰ Android 内存溢出怎么解决

Android 内存溢出的原因和解决方案如下:
1.Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M.因此我们所能利用的内存空间是有限的.如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误.原因主要有两个:
l 由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放.
l 保存了多个耗用内存过大的对象(如Bitmap),造成内存超出限制.
2. Static
static是java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例.所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(Context的情况最多)就要谨慎对待了.例如xxx源码:
public class IntentMapping {
private static Contextcontext;
//. . .
}

Ⅱ Android createBitmap创建大尺寸图像时,内存溢出out of memory(OOM)

BitmapFactory.Options bfOptions=new BitmapFactory.Options();
bfOptions.inDither=false;//使图片不抖动。不是很懂
bfOptions.inPurgeable=true;//使得内存可以被回收
bfOptions.inTempStorage=new byte[12 * 1024]; //临时存储
File file = new File(path);//path:图片的绝对地址
FileInputStream fs=null;
try {
fs = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap bmp = null;
if(fs != null) {
try {
bmp = BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions); //这样莫非就让bmp到了临时存储的位置?
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fs!=null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
转的。
http://wenku..com/view/c7b20053ad02de80d4d840f9.html

Ⅲ Android 内存溢出和内存泄漏的区别

内存溢出是指当对象的内存占用已经超出分配内存的空间大小,这时未经处理的异常就会抛出。比如常见的内存溢出情况有:bitmap过大;引用没释放;资源对象没关闭

如图,这是使用MAT工具查找内存泄漏的结果,例子是 handle 延时发送 message 而在关闭 activity 后 context 被销毁所引发的泄漏,这是作为目的性的测试所以问题比较容易找到,在实际开发中内存泄漏不易察觉并难以找到,当泄漏累积到一定程度是会引发 OOM 的。

Ⅳ android 总是内存溢出,网上说的好多种,有压缩的,软引用之类的,有过经验的大神们是怎样解决这类问题的

一般android的内存比较大,如果出现内存溢出,证明:
1、 代码质量问题,代码中有易造成内存泄露的代码。
2。、Android的栈空间的确不大, 避免过多次数调用递归。 如果递归过多又无法避免递归, 请在递归函数体内少生成使用局部变量,临时变量。
先检查第2点,如果没有第2点的情况就好好看看第1点是不是有问题搜索。
楼主的问题我也曾出现过。 原因是解析一个 120K的xml文件时,我采用dom解析我的对象, 递归方式, 每次节点都生成一堆临时变量,导致内存溢出

Ⅳ android scrollview内存溢出怎么解决

android scrollview内存溢出通常是由内存泄露导致。
1、内存泄露导致
由于我们程序的失误,长期保持某些资源(如Context)的引用,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成内存泄露。
Android 中常见就是Activity被引用在调用finish之后却没有释放,第二次打开activity又重新创建,这样的内存泄露不断的发生,则会导致内存的溢出。
Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill掉,这使得仅仅自己的进程被kill掉,而不会影响其他进程.
2、占用内存较多的对象
保存了多个耗用内存过大的对象(如Bitmap)或加载单个超大的图片,造成内存超出限制。
使用方法比较简单:
· 选择DDMS视图,并打开Devices视图和Heap视图
· 点击选择要监控的进程,比如:上图中我选择的是system_process
· 选中Devices视图界面上的"update heap" 图标
· 点击Heap视图中的"Cause GC" 按钮(相当于向虚拟机发送了一次GC请求的操作)
在Heap视图中选择想要监控的Type,一般我们会观察dataobject的 total size的变化,正常情况下total size的值会稳定在一个有限的范围内,也就说程序中的代码良好,没有造成程序中的对象不被回收的情况。如果代码中存在没有释放对象引用的情况,那么data object的total size在每次GC之后都不会有明显的回落,随着操作次数的增加而total size也在不断的增加。(说明:选择好data object后,不断的操作应用,这样才可以看出total size的变化)。如果totalsize确实是在不断增加而没有回落,说明程序中有没有被释放的资源引用。那么我们应该怎么来定位呢?
Android中内存泄露定位
通过DDMS工具可以判断应用程序中是否存在内存泄漏的问题,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?内存分析工具MAT Memory Analyzer Tool解决了这一难题。MAT工具是一个Eclipse 插件,同时也有单独的RCP 客户端,MAT工具的解析文件是.hprof,这个文件存放了某进程的内存快照。MAT工具定位内存泄漏具体位置的方法如下:
① 生成.hprof文件。Eclipse中生成.hprof文件的方法有很多,不同Android版本中生成.hprof的方式也稍有差别,但它们整体思路是一样的。我们在DDMS界面选中想要分析的应用进程,在Devices视图界面上方的一行图标按钮中,同时选中“Update Heap”和“Dump HPROF file”两个按钮,这时DDMS将会自动生成当前选中进程的.hprof文件。
② 将.hprof 文件导入到MAT工具中,MAT工具会自动解析并生成报告,点击“Dominator Tree”按钮,并按包分组,选择已定义的包类点右键,在弹出的菜单中选择List objects﹥With incoming references,这时会列出所有可疑的类。右键点击某一项,并选择Path to GC Roots﹥excludeweak/soft references,MAT工具会进一步筛选出跟程序相关的所有内存泄漏的类。这样就可以追踪到某一个产生内存泄漏的类的具体代码中。
使用MAT内存分析工具查找内存泄漏的根本思路是找到哪个类的对象的引用没有被释放,然后分析没有被释放的原因,最终定位到代码中哪些片段存在着内存泄漏。

Ⅵ 如何避免Android应用出现内存溢出OutOfMemoery

一、内存溢出 现在的智能手机内存已经足够大,但是对于一个应用程序来说智能手机当中稀缺的内存,仍然是应用程序的一大限制。在Android应用程序开发当中,最常见的内存溢出问题(OOM)是在加载图片时出现的,尤其是在不知道图片大小的情况下。 潜在的内存溢出操作主要包括以下几点: 1、从网络当中加载用户特定的图片。因为直到我们在下载图片的时候我们才知道图片的大小。 2、向Gallery加载图片。因为现在智能手机的摄像头有很高的分辨率,在加载图片的时候需要最图片进行处理,然后才能正常的使用。 请注意一点,Android系统是从系统全局的观念来分配内存以加载图片的,这就意味着,即使你的应用有足够大的内存可用,内存溢出问题(out of memroy,OOM)仍然可能出现,因为所有的应用共享一个加载图片的内存池(我们使用BitmapFactory进行解析)。 二、解决内存溢出问题 原文(Downsampling为了好理解,解释为,程序A)。程序A通过调整像素,同时使其均衡化来降低图片的分辨率。因为不管问题图片是因为太大而不能再手机上正常显现,这个图片都会缩短其宽度以在ImageView当中显示,当图片在ImageView当中显示时,我们会因为加载一些没有必要的原始图片而浪费掉内存。 因此,更加有效的加载图片的时机是在其初始化处理的时候。 以下是处理代码: 1: private static Bitmap getResizedImage(String path, byte[] data, int targetWidth){2:3: BitmapFactory.Options options = new BitmapFactory.Options(); 14: options.inSampleSize = ssize;15:16: Bitmap bm = null;17: try{18: bm = decode(path, data, options); 19: }catch(OutOfMemoryError e){ 39: result = result * 2;40:41: }42:43: return result;44: }三、AQuery当在Android应用程序开发当中使用AQuery组件时,处理这个问题会变的更加的简单。

Ⅶ android中用viewflipper来放大量图片时,内存溢出,求助

创建太多图片而不注意回收容易导致内存溢出啊位图很占内存的,而且占的好像是native内存建议创建图片用弱引用包装
或者
自己回收一下

Ⅷ 如何定位和解决android的内存溢出问题

进公司的第一个项目就遇到了一个比较难缠的客户,不过总算对付过去了。在第一个项目中由于app加载的图片、报表比较多,所以经常报出内存溢出的错误,很是头疼。不过在project leader的带领下,基本算是解决了。在此感谢一下my leader,Samuel.Cai辛苦了。哈哈......
以下是一些总结,ps:从我leader那边搞过来的,和大家分享一下,哈哈
1. 当项目中包含大量图片,或者图片过大,可能会oom

方法1 : 等比例缩小图片

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

方法2 : 对图片采用软引用,及时地进行recyle()操作

SoftReference<Bitmap> bitmap;
bitmap = new SoftReference<Bitmap>(pBitmap);
if(bitmap != null){

if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}

方法3 : 对复杂的listview进行合理设计与编码:
1. 注意重用Adapter里面的 convertView 以及holder机制的运用 ----- 参考资料: api demo list 14. Efficient Adapter

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];
for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}
v.setTag(holder);
} else {



2. 上述方法尝试还未成功,可用 lazy loading data ----- 参考资料:api demo list 13

方法4 : 单个页面,横竖屏切换N次后 OOM
1. 看看页面布局当中有没有大的图片,比如背景图之类的。去除xml中相关设置,改在程序中设置背景图(放在onCreate()方法中):
Drawable bg = getResources().getDrawable(R.drawable.bg);
XXX.setBackgroundDrawable(rlAdDetailone_bg);
在Activity destory时注意,bg.setCallback(null); 防止Activity得不到及时的释放

2. 跟上面方法相似,直接把xml配置文件加载成view 再放到一个容器里,然后直接调用 this.setContentView(View view);方法

避免xml的重复加载

方法5 : 在页面切换时尽可能少地重复使用一些代码,比如:重复调用数据库,反复使用某些对象等等......

方法6 :Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配
注意若使用这种方法:project build target 只能选择 <= 2.2 版本,否则编译将通不过。 所以不建议用这种方式

private final static int CWJ_HEAP_SIZE= 6*1024*1024;
private final static float TARGET_HEAP_UTILIZATION = 0.75f;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

Ⅸ 在android开发中加载的图片太大,有好几十兆,应该怎么办

如果图片太大会造成OOM内存溢出的错误,需要用Bitmap的压缩机制。
解决方案:
1.使用BitmapFactory.decodeStream替代createBitmap方法
原因是该方法直读取图片字节,调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap。

2.使用压缩读取技术
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageSdUri, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inSampleSize = 1;
int w = 320;
int h = 480;
h = w*height/width;//计算出宽高等比率
int a = options.outWidth/ w;
int b = options.outHeight / h;
options.inSampleSize = Math.max(a, b);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);

3.及时释放Bitamp
Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。但是我它应该还是能大大的加速Bitmap的主要内存的释放。

Ⅹ Android 内存溢出和内存泄漏的区别

内存溢出是指当对象的内存占用已经超出分配内存的空间大小,这时未经处理的异常就会抛出。比如常见的内存溢出情况有:bitmap过大;引用没释放;资源对象没关闭
如图,这是常见的bitma对象的溢出,显示像素过高或图片尺寸远远大于显示空间的尺寸时,通常都要将其缩放,减小占用内存。
内存泄漏(memory
leak)
有些对象只有有限的生命周期。当它们的任务完成之后,它们将被垃圾回收。如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏。随着泄漏的累积,app将消耗完内存。
比如,在Activity.onDestroy()被调用之后,view树以及相关的bitmap都应该被垃圾回收。如果一个正在运行的后台线程继续持有这个Activity的引用,那么相关的内存将不会被回收,这最终将导致OutOfMemoryError崩溃。
memory
leak会最终会导致out
of
memory!
如图,这是使用MAT工具查找内存泄漏的结果,例子是
handle
延时发送
message
而在关闭
activity

context
被销毁所引发的泄漏,这是作为目的性的测试所以问题比较容易找到,在实际开发中内存泄漏不易察觉并难以找到,当泄漏累积到一定程度是会引发
OOM
的。

热点内容
怎么看macbook配置信息 发布:2025-01-08 11:27:40 浏览:59
python带路径的文件 发布:2025-01-08 11:23:22 浏览:711
如何把手机内容存储 发布:2025-01-08 11:09:34 浏览:245
三星联系人存储程序停止 发布:2025-01-08 11:09:26 浏览:424
qq编程语言 发布:2025-01-08 11:04:26 浏览:39
安卓系统玩的王者荣耀怎么转苹果 发布:2025-01-08 11:02:21 浏览:850
走马灯编程 发布:2025-01-08 10:57:23 浏览:921
广州移动的服务密码是多少位数 发布:2025-01-08 10:57:20 浏览:775
uk系统提示服务器连接异常怎么回事 发布:2025-01-08 10:39:58 浏览:905
c语言输出float 发布:2025-01-08 10:38:23 浏览:380