2013-01-25 3 views
4

NetBeans를 사용하는 응용 프로그램을 실행 중이고 프로젝트 등록 정보에 최대 JVM 힙 공간을 1 GiB로 설정했습니다.JVM이 메모리를 시스템에 저장합니까? 그렇다면 어떻게 지울 수 있습니까?

그러나 여전히 메모리 부족으로 인해 응용 프로그램이 충돌합니다.

JVM에 메모리가 시스템에 저장되어 있습니까? 그렇다면 그 기억을 없애는 방법?

+3

응용 프로그램이 PermGen 메모리가 부족한 것일 수 있습니까? – CAMOBAP

+0

충돌의 원인은 코드에 있습니다. 코드가 메모리 할당을 통해 수행하는 작업을 분석하십시오. –

+1

새로 체크 아웃하면 코드가 정상적으로 실행됩니다. 연속 빌드를 실행 한 후 약 1 ~ 2 일 동안 디버그하면 메모리 부족 오류가 시작됩니다. –

답변

3

@camobap에서 언급했듯이 Perm Gen 크기가 매우 낮게 설정 되었기 때문에 OutOfMemory에 대한 이유가 있습니다. 이제 문제가 해결되었습니다.

답변과 의견을 보내 주셔서 감사합니다.

4

질문의 모든 세부 사항을 완전히 이해하지 못하고 있지만 중요한 부분은 이해할 만합니다.

JVM에 할당 된 메모리가 프로그램에서 생성 된 객체로 충분하지 않은 경우 OutOfMemoryError (예외는 아님)이 발생합니다. 이 경우 힙 공간을 1GB 이상으로 늘리는 것이 좋습니다. 1GByte로 충분하다면 메모리 누수가 발생할 수 있습니다. Java에서는 더 이상 필요하지 않은 객체에 대한 참조가있을 수 있습니다.

6

프로파일 러를 사용하여 코드를 분석하고 싶습니다. Netbeans가 좋습니다. 이렇게하면 응용 프로그램에서 메모리가 묶여있는 위치가 표시되며 문제가있는 위치에 대한 아이디어를 얻을 수 있습니다.

JVM은 메모리가 부족해지기 전에 오브젝트를 가능한 많이 가비지 수집 할 것이므로, 더 이상 필요하지 않게되면 오랫동안 참조를 보유 할 가능성이 있습니다. 그 중 하나, 또는 귀하의 응용 프로그램은 진정으로 많은 메모리가 필요한 응용 프로그램이지만, 특히 코드가 오랫동안 응용 프로그램을 실행 한 후에 문제가 발생하는 경우에는 코드에 버그가 될 가능성이 훨씬 높습니다 .

3

Java는 시작할 때 최대 힙 크기를위한 가상 메모리를 예약합니다. 프로그램이이 메모리를 사용함에 따라 더 많은 주 메모리가 OS에 할당됩니다. UNIX에서 이것은 상주 메모리로 나타납니다. Java 프로그램은 디스크로 스왑 할 수 있지만 가비지 콜렉션은 힙의 일부가 스왑되면 극도로 나쁜 성능을 나타내며 전체 시스템을 잠그거나 다시 부팅해야 할 수 있습니다. 프로그램이이 작업을 수행하지 않는다면, 메인 메모리에 완전히 있는지 확인할 수 있습니다.

응용 프로그램에 따라 1GB, 10GB 또는 100GB 이상이 필요할 수 있습니다. 최대 메모리 크기를 늘릴 수없는 경우 메모리 프로파일 러를 사용하여 소비를 줄이는 방법을 찾을 수 있습니다. VisualVM이 내장되어 있고 무료이며 괜찮은 작업을 수행하기 때문에 VisualVM으로 시작하십시오. 이것이 충분하지 않다면 무료 평가판 라이센스를 얻을 수있는 YourKit과 같은 상업용 프로파일 러를 시도하십시오 (일반적으로 문제를 해결할 수있을만큼 오래 작동합니다).

가비지 수집기는 필요에 따라 메모리를 자동으로 비 웁니다. 이 작업은 몇 초마다 또는 초당 1 회 이상 수행해야합니다. 이 경우 응용 프로그램 속도가 느려질 수 있으므로 최대 크기를 늘리거나 소비를 줄이는 것이 좋습니다.

+0

IDE (Netbeans) 디버깅이 계속 진행되는 동안 응용 프로그램이 단독으로 닫힙니다. 메모리 부족으로 인한 것입니까? –

+0

OutOfMemoryError를 throw하는 스레드가 catch하지 않으면 죽을 수 있습니다. 유일하지 않은 데몬 스레드 일 경우 프로그램이 종료 될 수 있습니다.디버거가이 오류를 트랩하여 정확한 위치를 파악할 수는 있지만 일반적으로 간단한 버그가 아니므로 디버거는 이런 종류의 문제를 진단하는 데 유용하지 않습니다. 문제는 일반적으로 프로그램에서 사용하도록 허용 한 양에 대해 너무 많은 메모리를 사용하고있는 것입니다. 그 이유를 확인하려면 전체 메모리 사용을 분석해야합니다. –

+0

@AndrewAlcock 1) JVM의 가상 메모리 크기에는 시작할 때 최대 힙 크기가 포함됩니다. 힙이 주소 공간 측면에서 연속적인지 확인하기 위해이 작업을 수행합니다. 최소 크기는 자유롭게 자랄 수있는 지점입니다. hello world 프로그램은 최소 크기를 사용하지 않으며 최소 크기에 도달하기 전에 JVM이 계속 GC 될 수 있습니다. 2) 이것은 사실이지만, JVM은 GC 후에 교환 할 수있는 작은 부분이 스왑 된 경우 너무 심하게 작동합니다. –

1

자바 컴파일러는 생각하는 것처럼 1 GiB를 할당하지 않습니다. Java는 필요한 메모리를 동적으로 할당하고 가비지도이를 수집합니다. 메모리를 할당 할 때마다 메모리를 확보 할 충분한 공간이 있는지 여부와 충돌하지 않는지 여부를 확인합니다. 그 많은 변수를 할당하는 코드를 작성하는 것이 거의 불가능할 것이므로 모든 코드를 추측하고 있습니다. 모든 메모리를 차지하는 배열 또는 ArrayList가 있습니다. 배열의 경우에는 아마도 변수의 크기를 할당하는 변수가 있고 너무 많은 메모리를 사용하도록 계산을 한 것입니다.ArrayList의 경우에는 요소를 추가하는 반복을 반복하는 루프가있을 수 있다고 생각합니다.

위의 오류에 대한 코드를 점검하면 좋을 것입니다.

0

"JVM Stores memory on system"의 의미는 무엇입니까? JVM은 OS에서 반드시 준수해야하지만, 동시에 프레임 워크 라이브러리 세트입니다. 그래서 상세한 단계에서 JVM 동작을 설명하려고합니다 :

1) 자바 코드가 바이트 코드로 컴파일됩니다 (JVM에서 이해할 수 있음).

2) JVM이 해당 코드를 처리하고 응용 프로그램이 실행 중일 때 JIT 컴파일러는 적절한 바이트 코드 을 JVM에있는 컴파일 된 소스에서 호출합니다. WINAPI와 같은 이전의 애플 리케이션과는 달리, 플랫폼은 애플리케이션을 완전히 16 진수로 실행했습니다. 따라서 1 번 창을 필요로하는 경우라면 앱이 완전히 필요한만큼 RAM 메모리를 훔쳐 가고있었습니다!

3) JVM은 컴파일 된 바이트 코드를 찾고 적절한 이벤트가 발생하면 해당 코드 만 컴파일합니다! (이것은 JVM에서 매우 중요합니다), 그렇게하지 않습니다. WinApi도 마찬가지였습니다!

4) 알고리즘상의 실수 일 수 있으며 예외적 인 오류 또는 시스템 오류로 인해 애플리케이션이 다운 될 수 있습니다 (신중하게 확인하십시오!).

5) 물론! JVM은 RAM 메모리에 의존한다. -), 우선 앱 소스 코드를 확인하는 것이 좋습니다!. JVM이 충돌합니까? 또는 응용 프로그램이 예외를 throw합니까?, 추적하십시오!

6) Borh HEAP 및 STACK 메모리는 COMPUTER MEMORY의 일부입니다. 이 방법으로 메모리 위치를 구별하는 것이 또 다른 목적입니다.

7) 메모리 부족은 Exception보다는 ERROR와 비슷하므로 플랫폼 문제이며 앱이 아닙니다. 하지만 절대적으로 잘못된 알고리즘을 생성하여 메모리 오류를 일으킬 수 있습니다. 예를 들어 객체 생성의 부정 루프, 일부 값 및 e.t.c의 무한 증분,

조금이라도 도움이 되었으면 좋겠다.

관련 문제