Android 애플리케이션 프로젝트의 간단한 예입니다 (Eclipse에서 사용). 코드 샘플의 차이점과 메모리 스냅 샷 사진의 차이점을 확인하십시오. com.google.gson.Gson.toJson을 호출하면 메모리 누수가 발생합니다. 샘플 1 (라인 printObject가 주석 호출)Android 및 Gson 메모리 누수
public class MainActivity extends Activity
{
...
@Override protected void onRestoreInstanceState(Bundle savedInstanceState)
{
// Log.v(TAG, ">>> ACTIVITY [onRestoreInstanceState] config:"+printObject(savedInstanceState));
super.onRestoreInstanceState(savedInstanceState);
}
public String printObject(Object object)
{
try { return new Gson().toJson(object); }
catch (Throwable ex){return "[FAILED to PRINT Object] : "+ex.getMessage();}
}
}
샘플 2 (주석 로그 제외한 1 짧은 동일한 코드를 .... 라인 그래서 printObjet에 호출.)
...
@Override protected void onRestoreInstanceState(Bundle savedInstanceState)
{
Log.v(TAG, ">>> ACTIVITY [onRestoreInstanceState] config:"+printObject(savedInstanceState));
super.onRestoreInstanceState(savedInstanceState);
}
,174 : 여기 활동을 다시 시작 야기 태블릿 회전 기기 (각각의 경우에 대해) 이클립스 메모리 분석기는 샘플 1 및 2 각각 스냅 (62) 후의 시간이다
51,515,둘째 화상의 녹색 영역은 "누설 용의자"
테스트에 사용 : 이클립스 4.2/GSON 2.2.2 (2.1)/안드로이드 4.2/안드로이드 태블릿과 그물에서 일부 유사한 문제가 있습니다 4.1.1문제점 의심 달빅 "로드"com.example.leaktest.MainActivity "3 개
62 인스턴스. system.PathClassLoader @ 0x416beb30 "은 1,959,008 (24.72 %) 바이트를 차지합니다.
질문 : Android 또는 Gson에서 문제입니까? 또는 나는 수업을 놓쳤다 :)?
주의해서 읽으십시오. 샘플 1에는 누출이 없습니다. 동일한 테스트 조건. 동일한 코드 샘플을 직접 테스트하고 다른 결과를 얻는 경우 다른 거래가 발생합니다. 하지만 나는 의심 스럽다. –
그건 그렇고 나는 Gson과 관련 있다고 확신합니다. 메모리 분석기에서 누출이 Gson의 NN 인스턴스로 의심되는 코드의 또 다른 덩어리에서 문제의 근원이 시작 되었기 때문입니다. –
위의 코드는 Android App 프로젝트 템플릿에 추가 된 유일한 코드입니다. 그래서 당신이 보는 것은 나쁜 일들이 일어날 수있는 유일한 곳입니다. 당신의 의견에 내가 실수 한 곳을 가리킬 수 있습니까? –