hw
항상 같은 참조 하나의 객체이기 때문에 10^6 개 항목을 추가하더라도 (내부적으로 ~ 10^6 개의 노드가 있음) 하나의 객체에 대한 많은 참조가 할당되지만 하나의 객체 만이 할당됩니다 .
for (i=0;i<10**6;i++) {
String hs = "Hello, world."
myDq.addToEnd(hw);
}
당신은 하나의 String
때문에 string interning의 거라고 : 전체 JVM에서 모두 동일한 문자열 리터럴은 동일 하나 개 String
객체를 사용하여 당신이 뭔가를 한 경우에도 사실
. 원래 String
의 문자 배열의 카피와 함께, 새로운 String
마다 할당
for (i=0;i<10**6;i++) {
String hs = new String("Hello, world.".toCharArray());
myDq.addToEnd(hw);
}
:
나는 당신이 그것을에 약간 수정 한 경우 같은 OOM를 얻을 수 있습니다 생각한다.
(OOM은 힙 공간이 부족하여 가비지 수집기 (GC)를 통해 충분히 회수 할 수 없을 때 Java에서 throw하는 OutOfMemoryError
에 대한 공통적 인 별칭입니다.이 경우 목록 및 모든 개체에 도달 할 수 있습니다. 이를 통해 내부 노드 객체 인 Integer
또는 String
값 등은 프로그램에서 여전히 도달 할 수 있으므로 GC'ed 될 수 없기 때문에 JVM은 더 많은 힙 공간을 필요로하지 않습니다.
본 적이 있습니까? http://stackoverflow.com/questions/4031242/how-much-memory-is-allocated-for-one-integer-object-in-java-how-to-find-out-thi? – sushain97
문제는 표면에 4031242가 중복되어있는 것처럼 보이지만 실제 질문은 '정수'가 프로그램이 힙 공간을 다 써 버리는 원인이되는 것 같습니다. '문자열'은 더 커야합니다. 하지 않습니다. 그래서 링크 된 질문은 실제로 OP의 진짜 질문에 대답하지 않는다는 점에서 그것이 실제로 복제본이라고 생각하지 않습니다. – yshavit
이 10 ** 6이 작동하지 않습니다. 그게 어때요 – muthukumar