2012-04-22 2 views
7

이 질문이 언어 독립적인지 아닌지는 확실하지 않습니다. 그렇기 때문에이 질문에 Java 질문을 할 것입니다. 루프가있는 경우루프 내에서 새로운 객체를 생성하는 효율

for (int i = 0; i < 9; i++) { 
    Object obj = new Object; 
    // fill object 
    // do something with data 
} 

루프의 반복마다 메모리의 새로운 공간이 생성되고 있습니까? 그렇다면 이전 공간을 폐기하고 있습니까? 그렇지 않은 경우가 더 효율적이

Object obj = new Object; 
for (int i = 0; i < 9; i++) { 
    // fill object 
    // do something with data 
} 

편집 같은 것을하는 것입니다 : 더 나은 질문을 예시하기 위해 업데이트 된 코드

+0

힙에 String을 작성해야한다고 생각하지 않습니다. 가장 좋은 방법은 String object = null과 같은 String 변수를 만드는 것입니다. 이것은 문자열에 대한 포인터 일뿐입니다. 반복 할 때마다 힙에 String 객체를 만들고이 방법을 이전 방법보다 느리게 만듭니다. 희망이 도움이 – allthenutsandbolts

+1

이 두 루프는 완전히 다른 일을합니다. –

+1

비슷한 ... [질문] (http://stackoverflow.com/q/8803674/617996) 이미 .... – PrimosK

답변

9

짧은 답변 : 바로 그런 일을 무시하면서, 자바 개발도 이러한 문제의 대부분 때문에 블랙 박스이며 JVM 자체에 의해 관리됩니다.

가비지 수집기는 수행 할 작업을 알게되며 상황에 따라 최선을 다하려고합니다.

또한 구체적인 예는 나에게 많은 의미가 없습니다. 더 자세히 설명해 주시겠습니까?

+0

나는이 같은 대답을 C++ – Steve

+1

과 같은 가비지 컬렉션이없는 언어에는 적용하지 않을 것입니다. 동일한 대답입니다. C++에도 적용됩니다. 원칙은 노력의 가치가 있다는 좋은 증거가 나올 때까지 물건을 최적화하지 않는 것입니다. (안타깝게도 많은 C/C++ 프로그래머가이 원칙을 무시합니다 ...) –

+0

당신이 말하는 것은 객체 생성을 여기와 같은 내부 가장 적절한 범위에 두는 것을 의미합니다. http://stackoverflow.com/questions/8803674/declaring-variables-inside-or-outside-of-a-loop – Steve

1

몇 가지 테스트를 실행하고 결과를 확인하지 않는 이유는 무엇입니까? 가비지 컬렉터가 작동하는 것은 사실이지만 최상의 작동을 알 수는 없습니다. 엄청난 양의 데이터로 작업 할 때 이러한 종류의 작업이 효율성에 영향을 줄 수 있습니다.

나는 this link가 필요한 것을 추적하는 데 도움이 될 것이라고 생각합니다.

7

올바른 "그것을 밖으로는 가비지 컬렉터의 그림을 보자"하지만 이러한 두 문장의 효과 있음을 이해해야의 기본 대답 : (빈

String object = new String(); 
object = array[i]; 

(1) 새를 만드는 것입니다) String을 만들고 "object"에 할당 한 다음 (2) array[i]의 값을 "object"에 할당합니다.

(2)의 할당은 (1)에서 수행 한 작업을 덮어 쓰므로 생성 한 첫 번째 문자열은 사용되지 않습니다. 가비지 컬렉터는 결국 저장소를 다시 확보하므로 잃어 버릴 염려는 없지만 여전히 불필요한 할당입니다. 당신은 String 변수가 새로운 객체를 참조 할 수 있지만 - 당신은 또한 String의 당신이 String 객체를 할당하면 사용자는이 값을 변경할 수 없습니다 그래서 자바에서 불변 있습니다 String object = null;

함께 시작할 수 기존의 것을 수정할 수 없습니다.