2010-03-19 3 views
14

이것이 바보 같은 질문 일지 모르지만 제 배경은 C++에 더 많은 것이고 자신의 기억을 관리하는 것입니다.안드로이드에서 기본 유형이 가비지 수집됩니까?

현재 게임 중 하나에서 가비지 수집 빈도를 줄이고 "지연"을 감지 할 수있는 모든 할당을 줄이고 있으므로 내가 만드는 모든 변수에 대해 Object (String 및 Rect 예를 들어) 나는 생성자에서 직접 작성한 후 간단히 임시 변수를 만들지 않도록하고있다. 라인 함수 ... (나는 의미가 있기를 바란다)

어쨌든 나는 더 많은 것을 오늘 밤 일하고 있었다. 가비지 컬렉션에 대한 나의 가정에 대해 완전히 틀릴 수도 있다는 것을 깨달았습니다. 기본 유형 (int, boolean, float)은 10이라는 라인 함수에서 생성되는 프리미티브 타입 변수입니다. 번 두 번째 추가 쓰레기 수거의 제 문제에요? 년 전 그래서

몇 초마다 내가

GC 같은 로그 캣에서 메시지를 볼 것입니다 지금 내가 그 메시지가 표시 101ms

에 4,010 개체/484,064 바이트를 해방마다 15-90 초 또는 이렇게 ...

그래서 내 질문을 바꿔서 :이 메시지를 볼 때 원시 타입 (int, float, boolean 등)이 포함되어 있습니까?

답변

24

원시 유형을 명시 안드로이드 특정 스레드되지 않은, 그래서 그들은 어떤 가비지 컬렉션이 발생하지 않습니다. 그러나, 당신은 명시 적으로 그렇게하지 않고도 원시 타입이 쉽게 객체가 될 수 있기 때문에 매우 신중해야합니다.

예를 들어, HashMap <>에 정수 키를 사용하려면 HashMap을 사용합니다. "int"는 객체가 아니기 때문에 컨테이너에서 사용할 수 없습니다. 정수는 원시 int의 객체 버전입니다. 이 같은 코드를 작성하는 경우, 정수 객체는 자동으로 생성됩니다 똑같은 일이 더 숨겨져 당신이 제네릭을 사용하지 않는 경우에 발생하지만 것

HashMap<Integer, Object> map = new HashMap<Integer, Object>(); 
int someNum = 12345; // no object created. 
map.put(someNum, null); // Integer object created. 

하는 것으로 :

HashMap map = new HashMap(); 
int someNum = 12345; // no object created. 
map.put(someNum, null); // Integer object created. 

이 특정 상황에서는 기본 정수 키의 컨테이너 인 Android의 SparseArray 클래스를 사용할 수 있습니다.

6

대답이 아닌 것처럼 보입니다. 자바에서 힙이 아닌 프리미티브가 스택에 저장되고 오브젝트 만 가비지 수집되는 것처럼 보입니다. 나는 이것에 대한 짧은 언급을 많이 발견했다. Wikipedia를 확인하라. 약간 더 무거운 것을 읽으려면 가비지 콜렉션 here에 실수로 포함되지 않도록 실제적으로 분리 된 메모리 위치에 프리미티브가 저장된다는 것을 좀 더 명확하게 설명하는 JVM 가비지 콜렉션 구현에 관한 논문을 참조하십시오. 감추고 싶다면 4 페이지가 가장 직접적으로 설명됩니다.

여기 객체 GC의 only scans pointers 방법 it checks that

+0

Android는 표준 스택 기반 JVM을 실행하지 않으며 고유 한 레지스터 기반 VM을 사용합니다. – mikerobi

2

[참고 : 아직 전체 댓글 권한이 없으므로 별도의 답변으로 추가하겠습니다.프리미티브는 자바 에 스택을 넣어하지 힙 으로 만 객체가 가비지 수집 되어있는 것처럼]

것 같습니다.

이것은 정확하지 않습니다. 프리미티브는 지역 변수와 클래스의 정적 또는 인스턴스 필드로 유지 될 수 있습니다. 후자의 경우에는 실제로 힙에 저장되지만 중요한 것은 자체적으로 "생명"이 없으며 특히 포함 된 개체와 별도로 gc'ed되지 않습니다. 안드로이드는 표준 스택 기반 JVM을 실행하지 않습니다

, 그것은 VM을 기반으로 자신의 레지스터를 가지고있다.

이것은 진실한 진술이지만, 오리지날 질문의 요지 옆에도 있습니다. 사실, 한 메소드가 다른 메소드를 호출 할 때 (그리고 계속해서)이 메소드의 활성화 프레임은 Dalvik 구현의 스택에 저장됩니다. 달리 액티베이션 프레임을 볼 때, Dalvik 액티비티 프레임은 안에 안에 가변 크기 스택을 포함하고 있지 않다는 점이 다릅니다. 이와 관련하여, Dalvik이 활성화 프레임을 정렬하는 방법은 전통적인 C와 유사한 언어 (C 또는 C++ 등)로 처리되는 것과 비슷합니다.

+0

N.P.E.가 생길 때까지 기다리십시오. 메소드 호출에서 auto에 기본 사소한 생성자가 없기 때문에 타입 - 지우개를 단 하나의 단서로 사용하여 추격 해 봅니다 - ope의 기본 질문은 숨겨진 obj 생성 및 G.C와 관련이 있습니다. 이는 'C'스타일 프로그래밍 패러다임에서 관리하기가 어렵지만 'D'가 ~ ~로 수행 할 수있는 유일한 방법입니다. 유일한 효과적인 접근 방식은 동기화 된 키워드를 사용하고 obj ref를 다시 사용하는 것입니다. 기존 자바 전통 주의자들로부터의 많은 짖음들)은 OP가해야 할 일은 한스 - J를 읽는 것입니다. Boehm의 gc.h 주석 –

관련 문제