Android FAQ 메모리 오버플로우(OOM)

1831 단어

원인


1. 메모리 유출로 인해 빈번한 메모리 유출로 인해 메모리 유출이 발생할 수 있다.2. 메모리를 많이 사용하는 대상은 메모리를 많이 사용하는 여러 개의 대상(예를 들어 Bitmap)을 저장한다.초대형 그림 불러오기;

2. 해결 방안


1. 메모리 유출로 인한 OOM은 안드로이드의 흔한 문제의 메모리 유출을 참고할 수 있다.
2. 초대형 이미지를 탑재하여 만든 OOM 솔루션:
1) 같은 비율의 축소 이미지는 setImageBitmap 또는 setImageResource 또는 BitmapFactory를 사용합니다.decodeResource가 큰 그림을 설정할 때 이 함수들은 decode를 완성한 후에 최종적으로 자바층의createBitmap을 통해 완성되며 더 많은 메모리를 소모해야 한다.
public static Bitmap scaleImage(Bitmap bitmap, int newWidth, int newHeight) {
        if (bitmap == null) {
            return null;
        }
        float scaleWidth = (float) newWidth / bitmap.getWidth();
        float scaleHeight = (float) newHeight / bitmap.getHeight();
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    }

2) 그림에 대한 소프트 인용을 사용하여 리시클() 조작을 신속하게 진행한다. 비록 시스템은 비트맵이 분배한 메모리가 최종적으로 소각되는 것을 확인할 수 있지만 너무 많은 메모리를 차지하기 때문에 자바더미의 제한을 초과할 가능성이 높다.따라서 비트맵을 다 썼을 때는 적시에 recycle을 떨어뜨려야 한다.리시클은 비트맵을 즉시 방출할 것인지는 확실하지 않지만 가상 컴퓨터에 "이 그림은 방출할 수 있다"는 암시를 줄 것이다.
SoftReference bitmap;
    bitmap = new SoftReference<>(pBitmap);
    if(bitmap != null){
        if(bitmap.get() != null && !bitmap.get().isRecycled()){
            bitmap.get().recycle();
            bitmap = null;
        }
    }

3) XML의 중복 로드를 방지합니다. 단일 페이지의 가로 세로 화면을 여러 번 전환하면 OOM이 발생할 수 있습니다.따라서 페이지 레이아웃에 비교적 큰 그림이 존재할 때 xml의 관련 설정을 제거하고 프로그램에 배경도를 설정해야 한다.
 ImageView imageView= (ImageView) findViewById(R.id.image_test);
 imageView.setBackground(getDrawable(R.mipmap.ic_launcher));

또는 xml 프로필을view로 불러와서 용기에 넣고this를 호출합니다.setContentView(View view)

좋은 웹페이지 즐겨찾기