oom内存溢出解决方案

时间:2022-10-16 20:59:35
Out Of Memory
oom:面试经常被问内存泄漏或叫内存溢出或来个洋文的oom,于是决定看看他是何方神圣。//摘自xxx的博客
(1)先从定义开始:
Android(Java)中常见的容易引起内存泄漏的不良代码
Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存是比较有限的。如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机。为了能够使得Android应用程序安全且快速的运行,Android 的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。一方面,如果程序在运行过程中出现了内存泄漏的问题,仅仅会使得自己的进程被kill掉,而不会影响其他进程(如果是system_process 等系统进程出问题的话,则会引起系统重启)。另一方面Android为不同类型的进程分配了不同的内存使用上限,如果应用进程使用的内存超过了这个上限, 则会被系统视为内存泄漏,从而被kill掉。
(2)结论是内存不够用就叫oom.
     Android设备内存一般比较小,容易引起oom.
     Android每个应用程序在专有的Dalvik虚拟机实例中运行,Android分配固定内存。超出分配的内存,引起oom,系统KILL掉,程序结束。
     Android系统进程OOM,机器重启。
内存溢出:oom

图片二次采样

//解决思路
    模拟要加载的大内存文件(图片啥的),制作一个小图片(质量什么不足 ,但是可以用);

1.建立一个图片信息对象(可交换图片文件)
ExifInterface exifInterface=new ExifInterface(图片地址)
并通过getAttributeInt()方法得到图片宽高
2.获取屏幕宽高信息,
getSystemService(Window_Service);
getdefaultdisplay()//得到默认显示getWidth//得到宽高
3.通过图片的宽高和屏幕宽高  设置压缩比
通过判断压缩的大小  得到最终压缩比
4.通过将压缩比 设置给BitMapFactory  得到新的BitMap 在设置给控件显示。从而避免手机OOM



import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ExifInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private ImageView image;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image = (ImageView) findViewById(R.id.image);
        try {
            ExifInterface exifInterface = new ExifInterface("mnt/sdcard/a.jpg");
            //如果没获取到 默认给0
            int width = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH,0);
            int heigh = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH,0);
            //得到模拟器(真机)的 屏幕宽高
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            int windowWidth = wm.getDefaultDisplay().getWidth();
            int windowHigth = wm.getDefaultDisplay().getHeight();
            //得到压缩比
            int scale=0;
            int w=width/windowWidth;
            int h=heigh/windowHigth;
            if(w>=h && w>1){
                scale=w;
            }else if (h>=w && h>1){
                scale=h;
            }
            //通过图片工厂的工具 对 压缩比进行设置  最后设置imageview
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize=scale;
            Bitmap bitmap = BitmapFactory.decodeFile("mnt/sdcard/a.jpg", options);
            image.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}