> 웹 프론트엔드 > 프런트엔드 Q&A > 11가지 Android 성능 최적화 인터뷰 질문 [답변 포함]

11가지 Android 성능 최적화 인터뷰 질문 [답변 포함]

藏色散人
풀어 주다: 2020-07-31 17:04:58
앞으로
4586명이 탐색했습니다.

추천: "2020 Android 면접 질문 모음 [Collection] "

실제 개발 답변과 참고 답변은 다를 수 있고, 오해를 불러일으킬까 봐 두려워서 이번 인터뷰 답변을 이해하셔야 합니다. 스스로에게 질문해보세요! 면접관은 이력서에 언급된 지식 포인트에 대해 얕은 것부터 깊은 것까지 질문할 것이므로 답을 외우지 말고 더 많이 이해하십시오.

1. 3단계 이미지 캐시에서는 이미지가 메모리에 로드됩니다. 그것을 처리하는 방법?

  • 참고 답변:
    • 우선, 3차 이미지 캐시가 어떤 것인지 알아야 합니다

      메모리가 충분하면 재활용되지 않습니다. 메모리가 부족할 경우 소프트 참조 객체를 재활용합니다

2. 500*500 png 고화질 사진을 메모리에 로딩한다면 얼마나 많은 메모리를 차지할까요?

  • 참고 답변:
    • 화면 비율을 고려하지 않음: 점유 메모리 = 500 * 500 * 4 = 1000000B ≒ 0.95MB
    • 화면 비율을 고려한 경우: 점유 메모리 = 너비 픽셀 x (inTargetDensity / inDensity ) x 높이 픽셀 x (inTargetDensity / inDensity) , WebView의 성능 최적화?
    참고 답변:
웹 페이지를 로드하는 과정에는 네이티브, 네트워크, 백엔드 처리 및 CPU가 모두 참여하며, 각각에는 필요한 작업과 종속성이 있으며 서로를 병렬로 처리하도록 합니다. 웹 페이지를 더 빠르게 로드할 수 있는 것은 상호 차단이 아닙니다.

WebView는 초기화 중에 먼저 데이터를 요청하여 백엔드와 네트워크를 유지할 수 있습니다. 유휴 상태에서.

제3자 브라우징 커널을 사용하여 일반적으로 사용되는 JS 현지화 및 지연 로딩

    • 백엔드 처리가 느리고 서버가 트렁크에 출력될 수 있으며 프런트엔드도 로드됩니다. 백엔드가 계산하는 동안 네트워크 정적 리소스.
      • 스크립트 실행 속도가 느린 경우 페이지 구문 분석을 차단하지 않고 스크립트가 마지막에 실행되도록 하세요.
      • 동시에 합리적인 사전 로딩과 사전 캐싱을 통해 로딩 속도의 병목 현상을 줄일 수 있습니다.
      • WebView는 초기화 속도가 느리므로 언제든지 사용할 수 있도록 WebView를 초기화하기만 하면 됩니다.
      • DNS와 링크가 느립니다. 클라이언트가 사용하는 도메인 이름과 링크를 재사용하는 방법을 찾으세요.
      • 4. Bitmap은 30M 대형 이미지와 같은 대용량 이미지를 어떻게 처리하며 OOM을 방지하는 방법은 무엇입니까?

      • 참고 답변: OOM 문제를 방지하려면 주로 이미지의 메모리 사용량을 줄이기 위한 크기 조정을 통해 대용량 이미지 로드를 관리해야 합니다.
      • BitmapFactory에서 제공하는 네 가지 이미지 로드 방법(
      decodeFile, decodeResource, decodeStream, decodeByteArray
    • )은 모두 BitmapFactory.Options 매개변수를 지원합니다. inSampleSize 매개변수
  • 를 통해 이미지를 쉽게 샘플링하고 크기를 조정할 수 있습니다. 사진 1024
1024 고화질 사진으로 보면. 그러면 차지하는 메모리는 1024
1024

4(4MB)입니다. inSampleSize가 2인 경우 샘플링된 사진은 512

512
4(1MB)만 차지합니다. (
  • 참고: 최신 공식 문서에 따르면 inSampleSize The 값은 항상 2의 지수, 즉 1, 2, 4, 8 등이어야 합니다. 외부 입력이 2의 지수에 충분하지 않은 경우 시스템은 기본적으로 2
      *와 같이 2에 가장 가까운 지수로 설정됩니다. )
    • 모두 함께 생각합니다. 샘플링 속도를 통해 이미지를 효과적으로 로드할 수 있습니다.
    • BitmapFactory.Options의 inJustDecodeBounds 매개변수를 true로 설정하고 이미지를 로드합니다BitmapFactory에서 이미지의 원래 너비 및 높이 정보를 검색합니다. .outWidth 및 outHeight 매개변수에 해당하는 옵션
    • 샘플링 비율 규칙에 따라 inSampleSize의 샘플링 비율을 계산하고 대상 View
      • BitmapFactory의 inJustDecodeBounds 매개변수를 설정합니다. 이미지를 거짓으로 만들고 다시 로드하는 옵션

5. 메모리 재활용 메커니즘 및 GC 알고리즘(다양한 알고리즘 및 응용 시나리오의 장단점) GC 원리 타이밍 및 GC 개체

  • 참고 답변:
    • 메모리 결정 객체 재활용을 위한 두 가지 메커니즘이 있습니다:
      • 참조 계산 알고리즘: 객체에 참조 카운터를 추가합니다. 참조가 만료될 때마다 카운터 값이 1씩 증가합니다. by 1; any 시간 카운터가 0인 객체는 더 이상 사용할 수 없습니다. 그러나 주류 Java 가상 머신에서는 메모리 관리에 참조 카운팅 알고리즘이 사용되지 않는 주된 이유는 객체 간 상호 순환 참조 문제를 해결하기 어렵기 때문에 또 다른 객체 생존 결정 알고리즘이 등장한 것입니다.
      • 도달성 분석 방법
      • : "GCRoots"라는 일련의 개체를 시작점으로 사용하여 이러한 노드에서 시작하여 아래쪽으로 검색하면 검색이 이동하는 경로를 참조 체인이라고 합니다. 객체에 GC 루트에 연결된 참조 체인이 없으면 객체를 사용할 수 없음을 증명합니다. 그 중 GC Roots로 사용할 수 있는 객체 : 가상 머신 스택에서 참조하는 객체는 주로 스택 프레임에서 로컬 변수를 참조하고, 로컬 메소드 스택에서는 Native 메소드에서 참조하는 객체, 및 메소드 영역의 클래스 정적 속성에 의해 참조되는 객체와 메소드 영역
      • GC 재활용 알고리즘에는 다음과 같은 네 가지 유형이 있습니다.
    • 세대 컬렉션 알고리즘
    • : 현재 상용 가상머신으로 Java Heap을 객체의 다양한 Life Cycle에 따라 New Generation과 Old Generation으로 구분하고, 각각의 특성에 따라 가장 적합한 수집 알고리즘을 채택하는 알고리즘을 사용합니다. 세대.
      • 신세대: 수많은 물체가 죽고 소수만이 살아남습니다. "복사 알고리즘"을 사용하면 살아남은 소수의 개체만 복사하면 됩니다.
      • 복사 알고리즘
      • : 사용 가능한 메모리를 용량에 따라 두 개의 동일한 크기 블록으로 나누고 한 번에 하나만 사용합니다. 이 메모리 블록이 모두 사용되면 남아 있는 개체를 다른 블록에 "복사"한 다음 이 메모리 공간 블록을 한 번에 정리합니다.
      • 간단한 구현과 효율적인 운영. 개체 생존율이 높으면 복사 작업이 더 많이 수행되고 효율성이 낮아집니다
        • 기존 세대: 개체 생존율이 높습니다. "Mark-Sweep 알고리즘" 또는 "Mark-Sweep 알고리즘"을 사용하면 더 적은 수의 재활용 개체만 표시하면 됩니다.
      • 마크 지우기 알고리즘
      • : 먼저 재활용이 필요한 모든 개체를 "표시"한 다음 표시된 모든 개체를 균일하게 "지우기"합니다.
      • 표시 및 지우기 프로세스의 효율성은 높지 않습니다. 지우고 나면 불연속적인 메모리 조각이 많이 생성됩니다. 공간 조각이 너무 많으면 프로그램 실행 중에 더 큰 개체를 할당해야 할 때 연속 메모리가 부족해질 수 있습니다. 그리고 또 다른 가비지 수집 작업이 미리 실행되어야 합니다.
        • 표시-구성 알고리즘
        • : 먼저 재활용이 필요한 모든 개체를 "표시"한 다음, 살아남은 개체가 한쪽 끝으로 이동하도록 "구성"하고 마지막으로 끝 경계 외부의 메모리를 직접 정리합니다. .
        • 마크 디플레이션 알고리즘은 살아남은 모든 개체를 한쪽 끝으로 이동하고 살아남지 않는 개체를 처리하므로 메모리 조각화가 발생하지 않습니다
    • 6. 메모리 오버플로와 메모리 오버플로의 차이점은 무엇입니까? AS는 메모리 누수를 감지하기 위해 어떤 도구를 가지고 있나요
참고 답변:

메모리 오버플로(메모리 부족)
    : 프로그램이 메모리를 적용할 때 사용할 메모리 공간이 충분하지 않음을 의미하며, 예를 들어, 메모리 부족이 발생합니다. 정수를 적용했지만 long에만 저장할 수 있는 숫자를 저장하면 메모리 오버플로가 발생합니다.
    • 메모리 누수
    • : 프로그램이 메모리를 적용한 후에는 적용된 메모리 공간을 해제할 수 없다는 의미입니다. 메모리 누수로 인한 피해는 무시할 수 있지만 메모리 누수 누적으로 인한 결과는 매우 심각합니다. 얼마나 많은 메모리가 있더라도 조만간 그런 일이 일어날 것입니다.
    • 메모리 누수는 결국 메모리 부족으로 이어질 것입니다!
    • 메모리 누수를 찾으려면 Android Studio와 함께 제공되는 AndroidProfiler
    • 도구 또는
    • MAT
    • 7 성능 최적화를 사용할 수 있습니다. 애플리케이션이 지연 없이 시작되는지 확인하는 방법은 무엇입니까? 흑백 화면을 처리하는 방법은 무엇입니까?
    • 참고 답변:
      • 애플리케이션 시작 속도는 애플리케이션에서 수행하는 작업에 따라 다릅니다. 예를 들어 많은 SDK를 통합하고 SDK의 초기화 작업을 메인 스레드에서 구현해야 합니다. 시차가 있을 것입니다. 필요하지 않은 경우 로딩을 지연하거나 하위 스레드 처리를 시작할 수 있습니다
      • 또한 인터페이스 지연에 영향을 미치는 두 가지 주요 요인은 인터페이스 그리기와 데이터 처리입니다.
        • 레이아웃 최적화 (include 및 merge 태그 사용, 복잡한 레이아웃 등에는 ConstraintLayout 사용을 권장합니다.)
        • onCreate()는 시간이 많이 걸리는 작업을 수행하지 않습니다. 페이지에 표시되는 뷰를 세분화하여 넣습니다. AsyncTask에서 단계별로 표시하고 핸들러를 더 잘 사용하세요. 이러한 방식으로 사용자가 보는 것은 뷰의 계층적 및 단계별 표시입니다. 먼저 검은색 화면이 표시된 다음 모든 뷰가 동시에 표시되지는 않습니다. 애니메이션으로 만드는 것이 더 낫습니다. 효과가 더 자연스러울 것입니다.
        • 멀티스레딩을 사용하는 목적은 onCreate()와 onReume()의 시간을 최대한 줄여 사용자가 최대한 빨리 페이지를 보고 조작할 수 있도록 하는 것입니다.
        • 메인 스레드 차단 시간을 줄입니다.
        • Adapter 및 AdapterView의 효율성을 향상시킵니다.
      • 흑백 화면이 나오는 이유: 애플리케이션을 시작하면 시스템에서 해당 프로세스가 이미 존재하는지 확인합니다. 존재하지 않으면 시스템 서비스에서 먼저 의도를 확인합니다. startActivity 에 정보를 입력한 다음 프로세스를 생성하고 마지막으로 콜드 스타트인 Actitivy를 시작합니다. 이 기간 동안 시작 시 흰색 화면과 검은색 화면이 나타나는 문제가 발생합니다. 시스템은 페이지를 그리고 레이아웃을 로드하기 전에 먼저 창(Window)을 초기화합니다. 이 단계에서 시스템은 스타일에서 설정한 테마에 따라 테마 테마 색상을 지정합니다. . 흰색 화면인가요, 검은색 화면인가요?
        • windowIsTranslucent 및 windowNoTitle, 두 속성을 모두 true로 설정합니다(명백한 지연이 발생할 수 있으므로 권장하지 않음)
        • 시작 페이지가 단지 이미지인 경우 시작 페이지 테마에 맞게 새 이미지를 설정하고 안드로이드를 설정하세요. :windowBackground 속성을 실행 페이지의 배경 이미지로
        • layer-list를 사용하여 launcher_layer.xml 이미지를 만들고, 실행 페이지별 테마의 배경으로 설정하고, 실행 페이지로 설정합니다. 레이아웃 배경입니다.

    8. 강한 참조가 null로 설정되면 재활용되나요?

    • 참고 답변:
      • 객체가 차지한 메모리는 즉시 해제되지 않습니다. 개체의 참조가 null로 설정된 경우 현재 스레드 스택 프레임에서 개체에 대한 참조 연결만 끊고 가비지 수집기는 백그라운드에서 실행되는 스레드이므로 사용자 스레드가 금고로 실행될 때만 발생합니다. point(safe point) 또는 safe 영역에서만 개체 참조 관계를 검사합니다. 개체가 참조되지 않으면 개체 메모리가 즉시 해제되지 않습니다. 참조는 finalize 메소드에서 복원됩니다. 개체 메모리는 개체를 복원할 수 없다고 판단되는 경우에만 지워집니다.

    9. ListView와 RecyclerView의 차이점

    • 참고 답변:
      • 애니메이션 차이점:
        • 에는 informItemChanged()와 같은 많은 애니메이션 API가 내장되어 있습니다. informDataInserted() , informItemMoved() 등; 애니메이션 효과를 사용자 정의해야 하는 경우 (RecyclerView.ItemAnimator 클래스)를 구현하여 사용자 정의 애니메이션 효과를 완성한 다음 RecyclerView.setItemAnimator()를 호출할 수 있습니다. ListView는 애니메이션 효과를 구현하지 않지만 어댑터 자체에서 항목의 애니메이션 효과를 구현할 수 있습니다.
        • 새로 고침 차이점:
        일반적으로 ListView에서 데이터를 새로 고치는 것은 전역 새로 고침 informDataSetChanged( ), 이는 많은 리소스를 소모합니다.
      • 자체적으로는 부분 새로 고침
      • 을 구현하는 것이 불가능하지만 ListView에서
      • 부분 새로 고침
      • 을 구현하려는 경우 항목 데이터를 새로 고칠 때 구현할 수 있습니다. Adapter의 onItemChanged() 메서드를 사용하고 메서드 위치에서 항목을 가져온 다음(getFirstVisiblePosition()을 통해 가능) getView() 메서드를 호출하여 이 항목의 데이터를 새로 고칠 수 있습니다. 예를 들어 새로 고침: informItemChanged();
        • 캐시 차이점:
        • RecyclerView에는 ListView보다 캐시 수준이 두 개 더 많고, 여러 개의 개별 ItemView 캐시를 지원하며, 개발자의 사용자 정의 캐시 처리 로직을 지원하고, 모든 RecyclerView를 지원합니다. 동일한 RecyclerViewPool(캐시 풀)을 공유합니다. ListView와 RecyclerView의 캐싱 메커니즘은 기본적으로 동일하지만 Cache 사용은 다른
        • 10입니다
    • BaseAdapter: 추상 클래스입니다. 실제 개발에서는 이 클래스를 상속하고 관련 메소드를 다시 작성합니다.
    • ArrayAdapter: 일반적인 작업을 지원합니다. 가장 간단한 어댑터는 텍스트 한 줄만 표시할 수 있습니다~
    • SimpleAdapter: 확장성이 좋고 다양한 효과를 사용자 정의할 수 있는 어댑터입니다!
    • SimpleCursorAdapter: 간단한 텍스트 유형을 표시하는 데 사용되는 ListView는 일반적으로 데이터베이스에서 사용되지만 약간 오래되어 권장되지 않습니다.

    11. LinearLayout, FrameLayout, RelativeLayout의 성능 비교. 왜?

    • 참조 답변:
      • RelativeLayout은 하위 뷰가 onMeasure를 두 번 호출하도록 합니다. LinearLayout에 가중치가 있으면 하위 뷰에 대해 onMeasure도 두 번 호출합니다.
      • 하위 뷰의 높이가 RelativeLayout은 RelativeLayout과 다르기 때문에 효율성 문제가 발생합니다. 이 문제는 하위 뷰가 복잡할 때 더욱 심각해집니다. 가능하다면 여백 대신 패딩을 사용해 보십시오.
      • 계층 구조의 깊이에 영향을 주지 않고 RelativeLayout 대신 LinearLayout 및 FrameLayout을 사용하세요.

위 내용은 11가지 Android 성능 최적화 인터뷰 질문 [답변 포함]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿