2020 종료 제조 업체, 11 안드로이드의 성능 최적화가 질문에 당신을 직면하게 될 것이다?

대답을 참조하여 실제 개발은 다른. 또한 두려워 오해 될 것이기 때문에, 그들은 여전히 ​​얼굴 질문에 스스로 대답 있도록 이해하기! 포인트를 다시 시작합니다 면접관에 대한 깊은 지식 질문은 그래서 더 이해하고, 다시 대답하지 않습니다 언급했다.

1 세 수준의 캐시 이미지, 이미지는 메모리가 빠른 버스트 경우, 어떤 일이 일어날 것입니다, 메모리에로드? 어떻게 처리합니까?

  • 참고 대답 :
    • 처음에 우리는 세 가지 수준의 캐시를 삭제해야하는 방법의 사진입니다

       

       

      재활용은 메모리가 부족하지 않은 경우. 메모리는 소프트 참조 객체를 복구 할 충분하지 않을 때

고화질 사진 (500) * (500)은 메모리 공간의 개수 할 필요가있는 경우 (2), PNG는 메모리에로드?

  • 참고 대답 :
    • 관계없이 말보다 화면 : 차지 메모리 = 500 * 500 * 4 = 1000000B ≈ 0.95MB
    • ㄱ 화면 비율의 경우 고려 : 화소 폭 (X) = (inTargetDensity / inDensity) × 픽셀 높이 × (inTargetDensity / inDensity) X 바이트 메모리에 대한 메모리를 화소 크기에 의해 점유

inDensity 대상 사진 (폴더 내의 리소스 파일이 있음), inTargetDensity 대상 화면을 나타낸다 dpi의 dpi로 나타내어

 

3, 웹보기의 성능 최적화?

  • 참고 대답 :
    • 웹 페이지를로드하는 과정은, 기본, 네트워크, 백엔드 처리는 CPU가 참여, 각각 필요한 작업과 종속성을 가지고, 그들은 웹 페이지를 빠르게로드 할 수 있습니다 전에 서로 서로를 처리하는 대신에 차단 평행하자를 :
      • 웹보기 초기화가 느린, 동시에 첫 번째 초기화에 데이터를 요청, 그래서 백 엔드 네트워크가 유휴하지 할 수 있습니다.
      • JS 일반적인 현지화 및 지연로드는 타사 브라우저 커널을 사용
      • 계산의 선단부의 후단에 또한 고정 네트워크 리소스 로케이션 동안 슬로우 백 - 엔드 처리는, 서버 서브 트렁크 출력을 가질 수있다.
      • 스크립트 실행 속도가 느린 페이지 해상도를 차단하지 않는, 최종에서 실행되는 스크립트를 보자.
      • 동시에, 적당한 프리로드가 사전 캐싱 로딩 속도 병목 작을 수있다.
      • 웹보기 초기화 IT는 웹보기 스탠드를 초기화 언제든지 좋은 느립니다.
      • DNS 링크와 느린는 클라이언트가 사용하는 재사용 도메인에 대한 방법과 링크의 생각합니다.

4, 비트 맵 방법 등 30M의 큰 그림으로 큰 그림을 처리하는 방법 움을 방지하기 위해?

  • 참고 답 : 문제 OOM을 피하기 위해 주로 메모리 풋 프린트를 줄이기 위해 이미지를 확장하여 경영의 큰 그림에로드 될 필요가있을 것이다.
    • BitmapFactory 이벤트 사진 (로드하는 방법의 네 가지 유형의 decodeFile, decodeResource, decodeStream, decodeByteArray ) 지원 BitmapFactory.Options 매개 변수, 당신은 샘플링 매개 변수의 쉽게 사진 inSampleSize를로 확장 할 수 있습니다
    • 예를 들어, 1024 1024 고화질 사진합니다. 그것은 메모리 1024 차지하고 1024 inSampleSize를가, 512에 대한 다음 샘플 사진 메모리 2 인 경우 (4), 그 4메가바이트이며, 512 (1메가바이트 4, 참고 : 최신 공식 문서, 값이해야 항상 상태 inSampleSize를 따라 외부 입력 미만 2 인덱스의 경우 인덱스 2는, 즉 1,2,4,8 등, 시스템, 대신이의 가장 가까운 전원을 선택하는 기본이 말할 것이다 ) *를
    • 고려. 효율적으로 영상을로드 할 수있는 속도를 샘플링하여, 프로세스는 다음이다
      • inJustDecodeBounds의 BitmapFactory.Options 매개 변수가 true로로드 사진으로 설정
      • BitmapFactory.Options 이미지 outWidth 파라미터 outHeight 대응 원래 폭과 높이 정보를 찍은
      • 일정한 샘플링 율과 뷰 결합 대상 샘플 속도의 요구되는 크기는 inSampleSize를 계산
      • 거짓, 다시로드 사진으로 설정 매개 변수 inJustDecodeBounds의 BitmapFactory.Options

5, 메모리 복구 메커니즘 GC 알고리즘 (이점 다양한 알고리즘 및 시나리오의 단점) GC 및 GC 기회 원리 개체

  • 참고 대답 :
    • 메모리 결정 객체의 재활용이 두 가지 메커니즘이 있습니다 :
      • 레퍼런스 카운팅 알고리즘 : 해당 장소에 대한 참조는, 카운터 값이 1만큼 증가 할 때마다 대물 카운터에 대한 참조 부가 상기 장애를 참조하면, 카운터 값이 1만큼 감소되고, 어떤 시간 카운터 객체는 더 이상 인 0을 사용합니다. 그러나, 참조 카운팅 알고리즘의 선택은 개체 간의 해결하기 어렵고 주로 때문에, 메모리를 관리하는 Java 가상 머신의 주류가 아닌 각 원형 기준 이므로 다른 타겟 생존 판정 알고리즘이 있었다, 문제.
      • 도달 가능성 분석 : 일련의 객체가 시작 지점으로 "GCRoots을"이라고 통해 통과 검색 경로라는 이러한 노드에서 아래 검색, 시작 참조 체인을 객체가 GC 뿌리 체인에 대한 참조가 없을 때, 연결되었을 때,이 객체의 증거는 사용할 수 없습니다. 오브젝트 GC 뿌리로서, 상기 개체 VM 스택 참조 주로의 스택 프레임을 참조 로컬 변수 의 원시 메소드 스택 네이티브 객체 메소드 참조 메소드 영역 클래스 정적 객체 속성을 참조하는 방법 영역 일정한 * 객체 참조
    • GC 수집 알고리즘은 다음과 같은 네 가지가 있습니다 :
      • 세대 수집 알고리즘 : 알고리즘은 현재 생존 기간의 주제에 따라 상용 가상 머신에 사용되는 자바 힙 신구 세대의로 구분하고, 각 시대의 특성에 따라 가장 적절한 수집 방법을 채택한다.
      • 신생대는 : 죽은 많은 수의 개체는 단지 몇 생존. "복제 알고리즘"을 사용하여, 라이브 객체의 소량 만이 복사 할 수 있습니다.
        • 복제 알고리즘 : 가용 메모리 용량이 두 개의 동일한 크기로 분할하여, 한쪽 만 사용한다. 이 하나의 메모리가 부족하면, 위의 또 다른 조각, 메모리 공간의 다음이 조각을 치워 일단의 객체 아직 살아 "복사". 간단하고 효율적인 운영. 더 복사 동작은 높은 타겟 생존에서 수행한다에게, 효율이 낮은 것
      • 올드 년 : 오브젝트의 높은 생존율. "- 청소 알고리즘 마크"또는의 사용 - 객체의 단지 적은 표시된 복구 "마크 정렬 알고리즘은"이 될 수 있습니다.
        • 마크 - 스윕 알고리즘 : 먼저 "태그"개체를 복구하는 모든 필요, 그리고는 "지우기"모든 객체가 표시됩니다를 통합. 마크와 두 개의 프로세스가 높지 않다 청소 효율, 청산 공간 파편 후 개별 메모리 조각화 많은 양의 너무 많이, 당신이 충분한 연속 메모리를 찾을 수없는 프로그램에서 실행되는 큰 개체를 할당 할 나중에 필요로 이어질 수 있으며, 우리는 다른 가비지 컬렉션 동작을 트리거하도록 강요하고있다.
        • 마크 - 정렬 알고리즘 : 먼저 "태그"개체가 개체의 생존 하나의 끝으로 이동, 직접 외부 메모리 단자 경계 밖으로 마지막으로 깨끗한 그래서, 다음, "새로 고침"을 복구 할 필요. 이 단편 메모리를하지 않도록 알고리즘을 구성하는 태그, 처리되는 모든 라이브 오브젝트는 끝으로 이동하는 것, 그리고 개체를 생존하지 않습니다

6, 메모리 누출 및 메모리 오버 플로우 차이? AS 어떤 도구는 메모리 누수를 감지 할 수 있습니다

  • 참고 대답 :
    • (OUT 메모리) 메모리 오버 플로우 :,,, 예를 들어 정수를 신청하지만, 즉, 긴 몇 충분한 저장하기 위해 저장하는 메모리가 나타납니다, 그것의 사용을위한 충분한 메모리 공간이 아닌 응용 프로그램 메모리의 시간에 프로그램을 말한다 메모리 오버 플로우.
    • 메모리 누수 (메모리 누수) : 메모리 공간을 확보 할 수있는 응용 프로그램 메모리가 메모리 누수 위험은 무시 될 수 있으며, 제출 된 후 프로그램을 의미하지만, 메모리 누수 매우 심각한 결과의 축적, 많은 메모리가 조만간 빛 점령 아무리. 메모리 누수는 결국 메모리 부족으로 이어질 것입니다!
    • 메모리 누수가 안드로이드 Studio를 사용하여 찾기와 함께 제공 AndroidProfiler의 도구 또는 MAT

7, 성능 최적화, 어떻게 응용 프로그램이 처리하는 방법을 Caton? 흑백 화면을 시작하지 않도록하는 방법?

  • 참고 대답 :
    • 응용 프로그램 실행 속도 당신이 그런 로트 SDK, SDK 및 초기화 작업을 통합 할 때, 그래서 메인 스레드에서 Caton 느낌이있을 것이다 달성하는 데 필요한 응용 프로그램의 일을 무슨에 따라. 부하가 지연 될 수 또는 서브 스레딩 비 필요로 켜지
    • 또한,의 영향 인터페이스 Caton 두 가지 요소, 즉 인터페이스 도면 데이터 처리.
      • 레이아웃 최적화 (사용, 병합 태그를 포함, 복잡한 레이아웃 ConstraintLayout 등을 권장)
      • 에서 onCreate ()는보기 페이지 쇼 시간이 많이 걸리는 작업을 점차적으로 핸들러와 함께 더 나은 밝혀졌다 AsyncTask를에서 무엇의 분해를 수행하지 않습니다. 많은 수준이 있습니다 사용자가 볼 수 있도록 검은 색 화면을 볼 처음되지 않습니다 하나 개의보기 표시로 단계 하나가, 다음 모두 표시보기를 클릭합니다. 애니메이션보다도 효과가 더 자연 스럽다.
      • 멀티 스레딩의 사용 목적은 사용자가 페이지, 빨리 가능한 한 페이지 작업을 볼 수 있습니다 가능한에서 onCreate ()와 onReume () 시간과 같은, 그래서 많이 줄이는 것입니다.
      • 메인 스레드 차단 시간을 줄일 수 있습니다.
      • 어댑터는 어댑터 뷰 AdapterView의 효율성을 개선합니다.
    • 흑백 화면 원인 : 우리는 응용 프로그램을 시작할 때 어떤 시스템 서비스, 마지막으로 Acitivy 시작 만드는 과정에, 다음에 만약 startActivity의 의도 정보를 확인하지 않습니다가있는 경우, 시스템은 이러한 프로세스가 이미이 있는지 여부를 확인합니다 그 차가운 시작. 시동 문제 검은 화면이 흰색 나타납니다,이 시간 동안 생산된다. 페이지의 레이아웃을 그리기 전에 시스템이 단계를 수행하는 동안, 시스템은 우리가 설정된 것을 테마 테마 테마에 따른 색상을 지정하는 것, 첫 번째 창 (윈도우)를 초기화하고,로드, 우리는 스타일이있는 디스플레이를 결정 설정 그것은 검은 색과 흰색 또는 검정이다.
      • windowIsTranslucent 및 windowNoTitle은,이 두 가지 속성이 true로 설정되어있다 (상당히 Caton의 경험이 될 것입니다, 권장하지 않음)
      • windowBackground 속성을 페이지 배경을 시작 : 시작 페이지가 다음 새 페이지를 시작하기 위해 특정 주제를 설정 단지 사진 인 경우, 테마 안드로이드 설정
      • 그림 launcher_layer.xml를 만들기 위해 레이어 목록을 사용하여 배경 페이지의 특정 테마를 시작하도록 설정하고 배경 시작 페이지 레이아웃으로 설정합니다.

8, 강한 참조가 null로 설정되어, 그것은 재생되지 않습니다?

  • 참고 대답 :
    • 그것은 즉시 객체가 차지하는 메모리를 해제하지 않습니다.  참조 된 개체가 null로 설정되어있는 경우, 그냥 객체에 대한 관계에서 참조하는 현재의 thread의 스택 프레임을 중단하고, 가비지 컬렉터 스레드는 백그라운드에서 실행되고, 사용자 스레드 안전 점 (안전 점) 또는 보안으로 실행하는 경우에만 영역 일부 개체 (파이널 라이즈 복구 방법 참조) 회수되기 때문에이 시간은 여전히 즉각적 오브젝트 메모리를 해제하지 않는 검사 대상 물체가 표시 될 참조되지 않은 오브젝트 레퍼런스의 관계를 검사한다. 객체는 메모리에 객체에 대한 참조를 제거합니다 복구 시간을 확인할 수 없습니다.

9 차이는 RecyclerView와의 ListView

  • 참고 대답 :
    • 애니메이션의 차이 :
      • 에서 RecyclerView 많은 애니메이션의 예를 들어 API, 내장 : notifyItemChanged (), notifyDataInserted () , notifyItemMoved () 와 같은, 필요한 사용자 정의 애니메이션 효과 사용자 정의 애니메이션 효과 (RecyclerView.ItemAnimator 클래스)를 구현하여 수행 할 수 있다면, 호출 RecyclerView.setItemAnimator ();
      • 그러나 ListView에는 애니메이션 효과를 달성하지 못했지만, 우리는 어댑터 자신의 애니메이션 항목이 될 수있다;
    • 새로 고침 차이 :
      • 글로벌 새로 고침 (notifyDataSetChanged와의 ListView가 보통이 될 것입니다) 데이터를 새로 고칠 매우 자원 소모, 혼자 캔이 부분 리프레시를 달성하지 , 당신은 ListView를 달성하려면하지만 부분 리프레시 데이터 항목이 새로 고침 할 때, 여전히 달성 할 수있다, 우리는 내부에 어댑터 항목의 위치를 얻을 수있는 onItemChanged () 메소드의 실현 (getFirstVisiblePosition에 의해 ()) 방법 할 수있는 다음이 항목의 데이터를 새로 고침의 getView () 메서드를 호출;
      • RecyclerView 부분 리프레시는, 예를 들면, 달성 될 수있다 : notifyItemChanged를 ();
    • 캐시의 차이 :
      • RecyclerView ListView에 여러 레벨 캐시, ItemView 캐시에서 지원하는 다수의 개발자 지정 논리를 캐싱보다, 같은 RecyclerView RecyclerViewPool은 (버퍼 풀) 모두가 공유를 지원합니다.
      • ListView에와 RecyclerView 캐싱 메커니즘은 기본적으로 동일하지만 서로 다른 캐시를 사용

10, ListView에 어떤 어댑터 어댑터입니다

참고 대답 :

 

  • BaseAdapter : 추상 클래스, 실제 개발, 우리는이 클래스를 상속 관련 방법, 가장 많이 사용되는 하나의 어댑터를 무시합니다!
  • ArrayAdapter와 : 지원하는 일반적인 작업, 간단한 어댑터 만 한 줄의 텍스트를 표시 할 수 있습니다 -
  • SimpleAdapter : 좋은 확장 성을 갖는 동일한 어댑터, 다양한 효과를 사용자 정의 할 수 있습니다!
  • SimpleCursorAdapter는 : 보통 데이터베이스가 사용됩니다 간단한 텍스트 형식의 목록보기를 표시하는 데 사용하지만, 비트는 오래된, 권장하지 않습니다!

11의 LinearLayout, FrameLayout이, RelativeLayout의 성능 비교, 그 이유는 무엇입니까?

  • 참고 대답 :
    • RelativeLayout의 자식보기 두 번 된 onMeasure를 호출,있는 LinearLayout은라고도 무게가 하위보기이 된 onMeasure
    • 자식보기가 복잡 할 때 높이가 효율성을 제기하는 경우 다른 RelativeLayout의 하위보기 및 RelativeLayout의는,이 문제는 더 심각한 될 것입니다. 당신이 할 수있는 경우에, 대신 여백의 패딩 사용하려고합니다.
    • 경우 깊이의 수준에 영향을 미치는, 대신 RelativeLayout의를있는 LinearLayout FrameLayout이를 사용하지 않습니다.

블로그 셋톱를 볼 수 년 동안 알리바바 안도라 얼굴 질문;

https://blog.csdn.net/chuhe1989/article/details/104804567

 

게시 56 개 원래 기사 · 원 찬양 한 · 전망 2900

추천

출처blog.csdn.net/chuhe1989/article/details/104848643