마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바 메모리 내부적인 질문입니다.

0 추천

자바의 메모리소멸에 관한 메커니즘이 궁금합니다.

 

FileData data1 = new FileData();
data1.fileName = "나루토";
data1.fileSize = "32222";
data1.fileDate = "1월20일";
 
ArrayList<FileData> arr = new ArrayList<FileData>();
arr.add(data1);
 
data1 = null;
 
FileData data = arr.get(0);
System.out.println(data.fileName);
System.out.println(data.fileSize);
System.out.println(data.fileDate);
 
 
요런 코드가 있다고 가정할때
현재 FileData 객체에 대한 참조주소값을 
data1, arr, data에서 메모리상의 FileData 객체를 참조하는 상황이잖아요?
그렇다면 data1을 null로 하더라도,
아직 두곳에서 참조를 하고 있다는 말이되나요?
arr과 data에서 아직 객체를 참조하고 잇으니 메모리수거의 대상이 아니라 생각합니다.
그래서 출력을 해봐도 잘나오구요.
그렇다는건 나머지 참조주소값을 모두 다 null처리해야지 가비지컬렉터에 수거가 된다는 의미가 되는건가요?
null처리를 하지 않으면 현재 메서드를 종료할때가 아니면 수거되지 않는건가요?
갸아악 (21,260 포인트) 님이 2014년 11월 27일 질문

2개의 답변

0 추천
객체를 참조하는 레퍼런스가 남아있으면 메모리정리 대상이 되지 않습니다.

null 처리를 하더라도 언제 메모리정리될지는 알 수 없습니다. GC를 수행하는 시기는 vm이 알아서 정합니다.
익명사용자 님이 2014년 11월 27일 답변
그렇다면 위와 같은 상황의 코드일때 다 사용한것은 무조건 다 null처리를 해줘야 한다는 말씀이신가요?
null 정리가 의미 없다는 말씀입니다.
0 추천

arrayList에 add하면 메모리 카피합니다.

참조하는게 아니라요.

그러니까 data1를 null하든 안하든  arr.get(0)하고 상관없음.

댓글보고 확인해보니 참조가 맞네요 ^^;

다른 경험하고 헛갈렸습니다. 

    /**
     * Adds the specified object at the end of this {@code ArrayList}.
     *
     * @param object
     *            the object to add.
     * @return always true
     */
    @Override public boolean add(E object) {
        Object[] a = array;
        int s = size;
        if (s == a.length) {
            Object[] newArray = new Object[s +
                    (s < (MIN_CAPACITY_INCREMENT / 2) ?
                     MIN_CAPACITY_INCREMENT : s >> 1)];
            System.arraycopy(a, 0, newArray, 0, s);
            array = a = newArray;
        }
        a[s] = object;
        size = s + 1;
        modCount++;
        return true;
    }

 

q1212 (26,020 포인트) 님이 2014년 11월 27일 답변
q1212님이 2014년 11월 27일 수정
잘못알고 계십니다.

arrayList.add()를 호출시 객체를 복사하지 않습니다.
같은 객체를 참조하는 레퍼런스 2개가 생깁니다. (data1 1개, arrayList 내부에 1개)
엥 메모리카피 맞지 않나요?
arrayList.get(0) 해서 어따가 담으면 그때는 참조하는 레퍼런스 2개 생기겠죠.
기존 객체를 add하면 그때는 메모리카피로 알고있었습니다만..
...