2010-05-10 3 views
2

변수를 선언하고 초기화 한 다음 나중에 다른 값으로 다시 초기화 할 때 내 프로그램에서 어떤 일이 발생하는지 알고 싶었습니다. ArrayList 또는 비슷한.Java 변수 -> 바꾸기? RAM 최적화

예를 들어 말씀 드리면 내 RAM에서 어떤 일이 발생합니까? 이 :

ArrayList<String> al = new ArrayList<String>(); 
...add values, work with it and so on.... 

al = new ArrayList<String>(); 

내 첫 번째 ArrayList가 RAM에 저장되었거나 두 번째 ArrayList가 첫 번째 ArrayList와 동일한 위치에 저장됩니까? 아니면 그냥 "알"의 참조를 바꿀 것인가?

교체되지 않으면 수동으로 첫 번째 arraylist가 차지하고 있던 RAM을 해제 할 수 있습니까? (가비지 컬렉터를 기다리지 않고) 먼저 설정하는 것이 도움이 되겠습니까?

니스 인사, 힙에

답변

4

코드를 게시하면 새 ArrayList 인스턴스가 할당됩니다.

ArrayList<String> al = new ArrayList<String>(); 
...add values, work with it and so on.... 

al.clear(); 
// now you can use a1 

을하지만 신중하게이 작업을 수행 - 당신이 더 긴 기간을 위해 그것을 사용하는 것입니다 다른 코드에 a1의 초기 인스턴스를 전달하는 경우, 다음 삭제 : 동일한 일을 다시 사용하려는 경우, 당신은이 작업을 수행 할 수 있습니다 문제가 발생하고 별도의 인스턴스가 필요합니다.

그러나 객체 배열과 ArrayList를 재활용하면 절약 효과가 크지 않습니다. ArrayList에 10 x 4096 바이트 문자열을 저장하는 경우 배열 목록 자체는 참조 크기와 비례하여 공간을 차지합니다. 4 바이트 x 10 = 40 바이트 경 이것은 단순화되었지만 원리는 정확합니다. 따라서 동일한 배열 목록을 다시 사용하더라도 개체 자체가 아닌 개체 참조를 저장하는 데 사용되는 메모리 만 저장하면됩니다. 이를 염두에두고 의도하지 않게 컬렉션을 수정하여 버그를 유발할 위험이 있으므로 대부분의 사람들이 재활용 목록을 신경 쓸 필요가 없다고 생각합니다.

현대 VM의 메모리 관리는 실제로 매우 뛰어나므로 필요할 때만 메모리 "최적화"를 도입해야합니다. 실제로 자연스러운 수명보다 오래 객체를 사용하면 가비지 수집 성능에 부정적인 영향을 줄 수 있습니다.

필자의 조언은 문제가 있다는 것을 알았을 때 그 원인을 확인했을 때 메모리 사용을 최적화하는 데 초점을 맞추고 명확하게 첫 번째 코드를 작성하는 것입니다.

행운을 빈다.

+0

+1 : 초기 최적화는 ... –

+0

ArrayList.clear()를 호출해도 포함되지 않은 배열의 모든 요소가 null로 설정되므로 (구현 세부 사항 임에도 불구하고) ArrayList.clear()를 호출해도 사용 가능하지 않습니다. 이전 배열의 요소를 지우는 것보다 새 ArrayList를 할당하는 것이 더 빠를 수 있습니다. 그러나 이들과 같은 것들은 프로파일 링되어야하며 더 빠른 것을 조기에 발견 할 수 있습니다 - 조숙 한 최적화는 ... –

+0

... 마이크로 벤치마킹의 악의적인 의붓 자식? – mdma

1

새로운 공간이 새로운 ArrayList를 위해 할당됩니다 poeschlorn.

가비지 수집을 강제로 수행 할 수 없으며 null을 할당하면 프로세서주기가 지연됩니다. System.gc()을 호출하여 JVM에서 가비지 수집기를 실행하도록 제안 할 수 있지만 보장은 없습니다.

+0

IIRC, Sun의 JVM에서 System.gc() 호출은 항상 젊은 세대를 수집하는 것보다 훨씬 느린 전체 GC를 강제 실행합니다. –

+0

@Esko, 나는 당신이 옳다고 생각하지만 엄밀히 말하면 JVM 구현에 대한 가정을 할 수는 없습니다. OP는 수동 방법을 요구했다. System.gc()는 "수동 방법"이다. –

4

새로운 ArrayList는 메모리의 다른 부분에서 할당되고, 참조가이를 가리 키도록 변경되며 이전 ArrayList가 더 이상 다른 것으로 참조되지 않으면 가비지 수집됩니다. Java에서 수동으로 메모리를 비울 수있는 방법은 없습니다. 자동으로 발생합니다.

설정 변수가 무의미하거나 그 직후에 다른 변수가 설정되거나 곧 범위 밖으로 나가는 지역 변수 인 경우 (그러나 ArrayList와 같은 데이터 구조 내부에서는 포함 된 배열의 요소를 null로 설정하고, 요소가 제거되면 메모리 누수가 발생하지 않도록해야합니다.

관련 문제