2010-01-06 3 views
0

:주요 java.lang.OutOfMemoryError와 : Java 힙 공간 내 코드는 다음과 같은 일을하고있다

for(SomeObject so : someObjects) 
{ 
    Blah b = so; 
    NewObject n = dao.GetNO(b.23); 
} 

즉이 각 반복에 반복을 위해 내부에 새 변수를 만드는 것입니다.

메모리 부족 문제의 원인 일 수 있습니까? 넷빈즈에 의해보고

오류 :

Caused by: java.lang.OutOfMemoryError: Java heap space 
     at java.lang.StringCoding$StringDecoder.decode(StringCoding.java:133) 
     at java.lang.StringCoding.decode(StringCoding.java:173) 
     at java.lang.String.<init>(String.java:443) 
     at java.lang.String.<init>(String.java:515) 
     at com.gargoylesoftware.htmlunit.WebResponseImpl.getContentAsString(WebResponseImpl.java:215) 
     at com.gargoylesoftware.htmlunit.WebResponseImpl.getContentAsString(WebResponseImpl.java:205) 

Upate 이것은 자바 콘솔 응용 프로그램이며, 전체 응용 프로그램은 기본적으로 forloop에서 실행됩니다.

+0

이것은 이유 일 수 있지만 반드시 그럴 필요는 없습니다. 더 이상 필요하지 않은 모든 객체를 릴리스하십시오. 특히 더 이상 필요하지 않은 개체를 여기에 보관하면 모든 컬렉션 (지도, 목록 등)을 확인하십시오. –

+0

힙 크기를 어떻게 설정합니까? –

+0

오류가 발생한 곳에서 실제 코드를 조금 더 게시 할 수 있습니까? 주목해야 할 한 가지 :'com.gargoylesoftware.htmlunit.WebResponseImpl.getContentAsString()'의 반환 값은 꽤 큰 문자열 일 것 같다. – MatrixFrog

답변

5

Java 5 이상 또는 기존 JVM 중 하나를 실행하고 있습니까? Java 명령 행을 -XX : + HeapDumpOnOutOfMemory로 설정하거나 JConsole으로 프로세스에 연결하고 힙 덤프를 요청하여 OOM의 원인을 추적 할 수 있습니다.그런 다음 Eclipse MAT 도구를 사용하여 덤프를 열고 개체 그래프를보고 프로그램의 개체를 보유하고있는 사람을 볼 수 있습니다. MAT는 객체 그래프를 지배하는 객체를 볼 수있는 뷰를 제공하므로 정확하게 누출되는 것이 무엇인지 명확하게 알 수 있습니다. 스택 추적을 보는 것은 도움이되지 않으며, 프로그램의 한 위치에서 누수가 발생하면 다른 위치에서 할당이 실패 할 수 있기 때문에 오도 된 수 있습니다.

+0

설명 된 문제의 범위가 주어진다면 과도한 것처럼 보입니다. –

+0

정말요? OOM을 본 후에 어떤 오브젝트가 힙을 차지하고 있는지 아는 것은 나에게 과도하지 않습니다. –

1

메모리에 들어갈 수있는 더 많은 물체를 잡으려고 할 때 메모리가 부족합니다. 루프에 객체를 생성하는 경우 범위를 벗어나는 즉시 GarbageCollected가 생성됩니다.

당신은 쓰기 그렇다면 - 넌 결코 오의 인스턴스를 두 개 이상 들고, 그래서 당신이 다른 곳에서 그들에 대한 참조를 저장하지 않는 한 그것을 위해, (원인이 될 않을거야

for (.....){ 
    Object o = new Object(); 
} 

루프 범위 밖에있는지도에 넣음).

더 많은 참조가있는 코드의 위치를 ​​찾아야합니다. 게시에서 더 이상 말할 수 없습니다.

현재, -Xmx 및 -Xms 옵션 (자세한 내용은 "java -X"를 입력하십시오)을 사용하여 JVM에서 사용중인 메모리 양을 늘릴 수도 있습니다. 실수를 찾는데 도움이되지 않습니다. netbeans 내부에서 실행 중이므로 동일한 JVM에서 실행 중이기 때문에 메모리가 부족할 수도 있습니다. netbeans는 사용하지 않지만 netbeans를 사용하여 새 프로세스를 포크하여 프로그램을 실행할 수 있는지 확인할 수 있으므로 (작지 않은 netbeans와 메모리를 공유하는 동안 실행할 필요가 없도록) 또는 명령 줄에서 직접 실행됩니다.

0

대부분의 경우 실수로 어딘가에있는 물건을 실수로 들고있는 것입니다. 일반적인 범인은 잘못 구현 된 캐시 또는 기능적으로 동등한 것입니다.

또 다른 가능성은 단순히 수행중인 작업에 필요한 메모리가 부족하다는 것입니다. 64MB의 힙을 사용하여 Java가 시작됩니다 (Sun의 기본 설정 이상). -xmx 매개 변수를 사용하여이를 변경할 수 있습니다.

마지막으로, 일부 특정 가비지 수집기 구현을 위해 충분한 시간 (총 프로세스 CPU 시간의 백분율로)이 가비지 수집에 소비 된 경우 OutOfMemoryError가 발생할 수 있음을 기억합니다. 컷오프는 90 % 범위였습니다. 나는 이것을 거의 10 년 만에 한번 보았고, 그것은 정말로 신경증적인 사용 사례였다. 아마도 그럴 수는 없지만 그렇게 할 수는 있습니다. 나는이 행동이 현대 자바에서 지속될 지 확신하지 못한다.

내 조언 : dao.GetNO(...)의 구현을 검사하여 개체가 부작용으로 생성되는지, 수명이 얼마인지 확인하십시오.

관련 문제