CodeDiver
116
2019-09-26 16:22:30
2
228

Java String.format 대신 쓸 수 있는거 없을까요? - 메모리 할당 방지


Android 앱에서 경과시간을 HH:mm:ss  형식으로 아래와 같이 사용하여 TextView에 표시하고 있습니다.

tv_timer.setText(  String.format("%02d:%02d:%02d", hour,min, sec) );


그런데 프로파일러로 메모리 할당 상태를 모니터링 해보니 매번 Allocated가 증가 하고 있습니다.

타이머라 1초에 한번씩 갱신하고 있는데 불필요한 GC가 동작할테고 왠지 찜찜합니다.

Java가 C++보다 메모리 관리가 더 힘든것 같습니다.

문자열 갱신하는데 뒤에서 무슨짓을 하는지 1초에 약 80개의 새로운 할당이 이루어집니다.

저 부분만 빼면 할당개수가 안 늘더군요.


값이 1자리일때는 앞에 "0"을 붙여주는 삽질을 해야하는지요?

24시간 동작해야 하는 프로그램이라 메모리 관리에 민감합니다. ㅠ.ㅠ


좋은 해결책 없을까요?

0
0
  • 답변 2

  • yamanin
    2k
    2019-09-26 18:28:08

    String.format을 사용하면

    Formatter를 매번 생성하고, StringBuilder도 계속 생성되내요. 내부에 더생성되는 건 생략하고 아래와 같이 하는 방법도 있을 듯 하나 동시성 문제가 발생할수 있으니 한 텍스트박스당 하나씩 만들면 안전하게 증가 없이 사용될듯합니다.


    public class StringFormatTest {

    public static Formatter formatter = new Formatter();

    public static String format = "%02d:%02d:%02d";

    public static void main(String[] args) {

    new Thread() {

    public void run() {

    while(true) {

    ((StringBuilder)formatter.out()).delete(0, 8);

    System.out.println(formatter.format(format, Calendar.getInstance().get(Calendar.HOUR), 

    Calendar.getInstance().get(Calendar.MINUTE), 

    Calendar.getInstance().get(Calendar.SECOND)).toString());

    try {

    sleep(1000);

    } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    };

    }.start();

    }

    }

    0
  • CodeDiver
    116
    2020-02-25 13:21:55 작성 2020-02-25 13:24:09 수정됨

    우선 TextView에 setText 는 시:분:초 를 분리해서 설정했더니

    증상이 좀 나아지더군요.


    그리고 앱이 장시간 구동중 오류나는 증상은 전혀 다른곳에 원인이 있었습니다.

    AppCompatTextView로 커스텀 폰트를 사용하는데 OpenGL 강제가속이 설정된 단말기에서

    OpenGL Out of memory 에러가 나서 단말기가 재부팅 되는 현상이 있었습니다.

    단발기의 개발자 옵션에서 강제가속을 꺼주니까 해결되네요. ;;

    메모리가 미세하게 증가하는 현상은 3일마다 재부팅해서 임시방편으로 조치했습니다.


    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.