안녕하세요!
항상 많은 도움과 조언을 얻어가서 너무 감사드립니다.
현재 개발하는 어플에서 메모리가 넘쳐서 어플이 종료되는 문제가 있습니다.
3D 모델을 불러와서 가시화를 하는 도중에 native heap의 메모리를 너무 많이 소비하여 프로세스가 종료하는 문제입니다.
해당 문제에 대한 해결책을 적용하기 위하여 우선적으로 현재 디바이스(태블릿, RAM : 3GB)에서 사용할 수 있는 여유 heap을 체크할 수 있도록 Thread를 활용하여보았습니다.
해당 코드는 아래와 같습니다.
Thread myThread = new Thread(new Runnable() {
public void run() {
while(true) {
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
manager.getMemoryInfo(info);
String availMem = StringUtil.getString(info.availMem / 1048576L);
Log.e("Memory", availMem);
}
}
});
다만 문제점이 있습니다.
위의 코드는 현재 MainActivity.java 에 속해있으며, 메인 코드에서 myThread.start(); 명령을 통하여 어플 전체 오느곳에서나 Log를 통해 여유 메모리를 체크할 수 있는 상황입니다.
하지만, 해당 쓰레드가 실시간으로 돌아가기 때문에 과부하가 걸리고, 전체 프로세스에 악영향을 주고 있으며, 이를 완화하기 위하여 매 0.5초마다 로그를 찍는 방식으로 개선하려 하였습니다.
이를 위하여 Thread 의 while 문 마지막단에 Thread.Sleep(500); 을 걸러 과부하를 줄이려 하였습니다.
하지만 해당 Sleep 구문에 오류가 있는 상황입니다.
해결책을 알아보던 중 클래스를 따로 생성하여 sleep을 걸어보니 걸리는것을 확인하였지만, 그렇게 될 경우 반대로 ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 구문에서 getSystemService 함수를 사용할 수 없게 되었습니다.
결국 Sleep을 포기하던지 메모리 체크를 정확하게 할 수 없던지 양자택일의 상황에 처해있는데요,
혹시 이와같은 문제에 대하여 조언이 있으시다면 언제든지 부탁드리겠습니다!
감사합니다!