1. 가비지 컬렉션이 발생하는 시점에 대해서 제어할 수 없다.
System.gc() 를 호출하여 안드로이드에 명령을 할 수는 있지만, 최종적으로는 달빅 가상머신이 언제 실행할지를 결정한다.
2. 가비지 컬렉션이 실행되는 상황
- GC_FOR_MALLOC : 힙이 가득차서 메모리를 할당하지 못하고, 할당이 계속 이루어질 수 있도록 메모리가 리클레임되어야 할 때 발생
- GC_CONCURRENT : 컬렉션이 시작되는, 보통은 리클레임할 충분한 오브젝트들이 있을 때 발생.
- GC_EXPLICT : system.gc()를 호출해서 가비지 컬렉션을 명백하게 요청할 때 발생
- GC_EXTERNAL_ALLOC : External native memory alloc이 발생하여 메모리가 full인 경우.
- GC_HPROF_DUMP_HEAP : HPROF 파일을 생성할 때 발생
3. 참고
안드로이드 2.3 이후 버전에서는 가비지 컬렉션 작업이 분리된 스레드에서 실행되므로 이전처럼 모든 앱이 정지되는 현상이 발생되지는 않는다.
하지만 가비지 컬렉션이 일어나면 메인 스레드는 여전히 영향을 받는다. (5ms)
Android - 응답성 강화하기
1. 응답성 강화하기
- 일반적으로 100ms에서 200ms가 사용자가 애플리케이션에서 지연을 느낄 수 있는 경계 지점임
- 벡그라운드에서 뭔가 하고 있으면 ProgressBar와 ProgressDialog를 쓸 것
- 특히 게임에서는, 자식 쓰레드에서 움직임에 대한 계산을 할 것
- 멈춘 것 처럼 인식 하지 않도록 할 것
2. 어떻게 ANR을 피할 것인가?
- 메인 쓰레드에서 실행하는 메소드는 최소한의 일을 해야 함
- 특히 onCreate(), onResume()과 같은 핵심 생명주기 메소드 최소한 작은 일을 수행해야 함
- 네트워크, 데이터베이스 오퍼레이션 같은 잠재적으로 긴 것들은 자식 쓰레드에서 수행
- Thread.wait(), Thread.sleep()는 호출 하지 말 것
- 자식 쓰레드가 완료될 때 알려주기 위한 핸들러를 제공해야 함
- 노티피케이션 매니저를 사용할 것
- 일반적으로 100ms에서 200ms가 사용자가 애플리케이션에서 지연을 느낄 수 있는 경계 지점임
- 벡그라운드에서 뭔가 하고 있으면 ProgressBar와 ProgressDialog를 쓸 것
- 특히 게임에서는, 자식 쓰레드에서 움직임에 대한 계산을 할 것
- 멈춘 것 처럼 인식 하지 않도록 할 것
2. 어떻게 ANR을 피할 것인가?
- 메인 쓰레드에서 실행하는 메소드는 최소한의 일을 해야 함
- 특히 onCreate(), onResume()과 같은 핵심 생명주기 메소드 최소한 작은 일을 수행해야 함
- 네트워크, 데이터베이스 오퍼레이션 같은 잠재적으로 긴 것들은 자식 쓰레드에서 수행
- Thread.wait(), Thread.sleep()는 호출 하지 말 것
- 자식 쓰레드가 완료될 때 알려주기 위한 핸들러를 제공해야 함
- 노티피케이션 매니저를 사용할 것
Android - ANR 이란?
1. ANR이란 무엇인가?
Application Not Responding의 약자이다.
어플리케이션이 응답하지 않는 경우 안드로이드 시스템에서 보여주는 에러이다.
메인 스레드(일명, UI 스레드)가 일정시간 동안 잡혀 있으면 발생한다.
2. 언제 ANR이 발생하는가?
- 터치를 통한 사용자 입력이 5초 내에 처리되지 않았을 때
- 브로드캐스트가 10초 내에 처리되지 않았을 때
- 서비스가 20초 내로 처리되지 않을 때
3. 왜 ANR이 발생하는가?
앱이 무한 루프에 빠지거나 OOM(Out Of Memory)가 나야 ANR이 발생하는 것이 아니다.
시간이 좀 걸리는 처리를 해도 ANR이 충분히 발생할 수 있다.
4. ANR을 피하려면?
- 시간이 오래걸리는 작업은 스레드를 통해 처리하도록 권장한다.
- 사용자에게는 프로그레스바 등을 이용해 진행 과정을 안내해 기다리도록 한다.
- 이를 위해, 안드로이드에서 상속받아 사용할 수 있는 다양한 방법을 제공하고 있다.
Application Not Responding의 약자이다.
어플리케이션이 응답하지 않는 경우 안드로이드 시스템에서 보여주는 에러이다.
메인 스레드(일명, UI 스레드)가 일정시간 동안 잡혀 있으면 발생한다.
2. 언제 ANR이 발생하는가?
- 터치를 통한 사용자 입력이 5초 내에 처리되지 않았을 때
- 브로드캐스트가 10초 내에 처리되지 않았을 때
- 서비스가 20초 내로 처리되지 않을 때
3. 왜 ANR이 발생하는가?
앱이 무한 루프에 빠지거나 OOM(Out Of Memory)가 나야 ANR이 발생하는 것이 아니다.
시간이 좀 걸리는 처리를 해도 ANR이 충분히 발생할 수 있다.
4. ANR을 피하려면?
- 시간이 오래걸리는 작업은 스레드를 통해 처리하도록 권장한다.
- 사용자에게는 프로그레스바 등을 이용해 진행 과정을 안내해 기다리도록 한다.
- 이를 위해, 안드로이드에서 상속받아 사용할 수 있는 다양한 방법을 제공하고 있다.
Android - 웹뷰 성능 향상
1. 캐쉬 사용하지 않기
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);로 브라우져 캐쉬를 끈다.
2. 하드웨어 가속 기능 사용하기
렌더링에 대해서 하드웨어 가속 기능을 사용할지 여부인데, 3.0 부터 지원.
default는 false이며, 4.0부터는 default가 true.
AndroidManifest.xml에서 android:hardwareAccelrated를 true로 설정
3. 렌더링 우선 순위 높이기
강제적으로 렌더링 기능에 대한 우선 순위를 높이는 방법이다.
webView.getSettings().setRenderPriority(RenderPriority.HIGH)로 설정
API Level 18부터는 deprecated.
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);로 브라우져 캐쉬를 끈다.
2. 하드웨어 가속 기능 사용하기
렌더링에 대해서 하드웨어 가속 기능을 사용할지 여부인데, 3.0 부터 지원.
default는 false이며, 4.0부터는 default가 true.
AndroidManifest.xml에서 android:hardwareAccelrated를 true로 설정
3. 렌더링 우선 순위 높이기
강제적으로 렌더링 기능에 대한 우선 순위를 높이는 방법이다.
webView.getSettings().setRenderPriority(RenderPriority.HIGH)로 설정
API Level 18부터는 deprecated.
Android - 효율적인 코드 작성하기2
1. Constants 를 final로 선언하라
컴파일러는 <clinit>라고 불리는 class initializer method 생성하며 이는 클래스가 처음 생성될 때 실행된다.
final로 설정되지 않은 값들은 reference될 때 field lookup을 사용해서 접근하여 속도가 조금 느린 편이다.
그러나 final로 설정하면 field lookup을 거치지 않고 바로 사용할 수 있어 빠른 편이다.
class와 function도 final로 설정함으로서 약간의 성능 향상을 노릴 수 있다.
2. Enhanced For Loop 문법을 주의하여 사용
반복문을 여러 번 사용할 경우에는 특히 object 생성에 주의해야 한다.
횟수가 기하학적으로 증가할 수 있고, 발견이 어려울 수 있기 때문이다.
3. Enums를 피하라
Enums의 접속 속도가 느리기 때문에 자주 사용하면 성능이 저하될 수 있다.
따라서 Enums를 지속적으로 사용하는 경우에는 local변수로 만들어 사용하는 것이 좋다.
4. 부동소수점(float)을 가능한 피하라
5. 곱셈 연산을 사용하라.
나누기 연산보다는 곱셈 연산을 사용하는 것이 성능에 더 좋다.
컴파일러는 <clinit>라고 불리는 class initializer method 생성하며 이는 클래스가 처음 생성될 때 실행된다.
final로 설정되지 않은 값들은 reference될 때 field lookup을 사용해서 접근하여 속도가 조금 느린 편이다.
그러나 final로 설정하면 field lookup을 거치지 않고 바로 사용할 수 있어 빠른 편이다.
class와 function도 final로 설정함으로서 약간의 성능 향상을 노릴 수 있다.
2. Enhanced For Loop 문법을 주의하여 사용
반복문을 여러 번 사용할 경우에는 특히 object 생성에 주의해야 한다.
횟수가 기하학적으로 증가할 수 있고, 발견이 어려울 수 있기 때문이다.
3. Enums를 피하라
Enums의 접속 속도가 느리기 때문에 자주 사용하면 성능이 저하될 수 있다.
따라서 Enums를 지속적으로 사용하는 경우에는 local변수로 만들어 사용하는 것이 좋다.
4. 부동소수점(float)을 가능한 피하라
5. 곱셈 연산을 사용하라.
나누기 연산보다는 곱셈 연산을 사용하는 것이 성능에 더 좋다.
Android - 효율적인 코드 작성하기1
1. 오브젝트 생성을 피하라
오브젝트 생성은 메모리를 할당하는 작업으로, 일반 작업에 비해 load가 큰 편.
Java의 GC는 매우 큰 작업으로 구분되는데, 쓸데없는 메모리 할당으로 GC를 초래하게 되면 성능저하를 유발.
반복문에서의 오브젝트 생성은 오버헤드가 크므로 피함.
2. Native Method를 사용하라.
Native Method들은 C/C++ 등으로 구현되어 있어 Java 코드보다 약 10~100배 빨리 실행된다.
따라서 Native Method들을 이용하여 구현하는 것이 성능에 좋다.
3. 내부적인 getters/setters를 피하라
일반적인 OOP개념의 getter/setter는 합리적이나 클래스 내부에서의 변수 접근에도 getter/setter를 사용하는 것은 비효율적이다.
4. Cache Field Loop ups
맴버변수에 접근하는 것은 지역 변수에 접근하는 것보다 훨씬 속도가 느리다.
따라서 맴버변수를 여러 번 사용하는 함수에서는 맴버변수를 지역변수에 할당하여 처리하는 것이 효율적이다.
오브젝트 생성은 메모리를 할당하는 작업으로, 일반 작업에 비해 load가 큰 편.
Java의 GC는 매우 큰 작업으로 구분되는데, 쓸데없는 메모리 할당으로 GC를 초래하게 되면 성능저하를 유발.
반복문에서의 오브젝트 생성은 오버헤드가 크므로 피함.
2. Native Method를 사용하라.
Native Method들은 C/C++ 등으로 구현되어 있어 Java 코드보다 약 10~100배 빨리 실행된다.
따라서 Native Method들을 이용하여 구현하는 것이 성능에 좋다.
3. 내부적인 getters/setters를 피하라
일반적인 OOP개념의 getter/setter는 합리적이나 클래스 내부에서의 변수 접근에도 getter/setter를 사용하는 것은 비효율적이다.
4. Cache Field Loop ups
맴버변수에 접근하는 것은 지역 변수에 접근하는 것보다 훨씬 속도가 느리다.
따라서 맴버변수를 여러 번 사용하는 함수에서는 맴버변수를 지역변수에 할당하여 처리하는 것이 효율적이다.
Android - 개발자 옵션 활성화
설정 -> 휴대폰 정보 -> 소프트웨어 정보 -> 빌드 번호를 계속 터치하면
'개발자가 되셨습니다'라는 토스트 메시지가 표시됨.
이후 설정 메뉴로 들어가면 개발자 옵션 항목이 보임.
'개발자가 되셨습니다'라는 토스트 메시지가 표시됨.
이후 설정 메뉴로 들어가면 개발자 옵션 항목이 보임.
피드 구독하기:
글 (Atom)