2013-09-07 2 views
1

Integer()의 크기는 얼마입니까? 나는 아래에서 일어난 일 때문에 물어 본다.Java에서 Integer()의 크기는 얼마나됩니까?

10^6 정수 ([0, 10^6])를 양 끝 큐에 넣으려고하면 힙 메모리가 부족합니다. 구현은 이중 연결리스트를 사용하고 문자열을 사용하는 경우, 내가 힙의 크기를 증가하지 않고 마무리 할 수 ​​있었다

Deque<Item> implements Iterable<Item> { } 

그러나 나타납니다

String hw = "Hello, world."; 

for (i=0;i<10**6;i++) { 
myDq.addToEnd(hw); 
} 
+0

본 적이 있습니까? http://stackoverflow.com/questions/4031242/how-much-memory-is-allocated-for-one-integer-object-in-java-how-to-find-out-thi? – sushain97

+0

문제는 표면에 4031242가 중복되어있는 것처럼 보이지만 실제 질문은 '정수'가 프로그램이 힙 공간을 다 써 버리는 원인이되는 것 같습니다. '문자열'은 더 커야합니다. 하지 않습니다. 그래서 링크 된 질문은 실제로 OP의 진짜 질문에 대답하지 않는다는 점에서 그것이 실제로 복제본이라고 생각하지 않습니다. – yshavit

+0

이 10 ** 6이 작동하지 않습니다. 그게 어때요 – muthukumar

답변

9

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은 더 많은 힙 공간을 필요로하지 않습니다.

+0

+1 좋은 explnation.Well 그것은 OOM을 정교한다면 미래의 사용자를 위해 좋을거야 – SpringLearner

+0

좋은 생각, 지금 할 것이다! 감사. – yshavit

관련 문제