저는 @Founder의 의견에 동의하지 않습니다. OOM이 발생하자마자 힙 메모리의 크기를 변경하기 시작하는 사람들을 많이 보았는데, 힙 메모리를 조정한다고 해서 더 큰 것이 더 좋은 것은 아닙니다.
먼저 지식을 전파하세요.
힙 메모리는 신세대와 구세대로 구분됩니다. 신세대는 GC가 필요한 개체를 저장하는 데 사용됩니다. 일정 기간 이상 GC가 이루어지지 않으면 Old Generation으로 승격되어 저장됩니다.
신세대보다 구세대가 더 넓은 공간을 갖게 될 것이다.
OOM이 발생하면 Old Generation에 메모리가 부족합니다(신세대에 메모리가 부족하면 Old Generation에 배치하여 저장하게 되기 때문입니다).
다음과 같은 방법으로 문제를 분석하고 해결하는 것이 좋습니다.
1. 컬렉션에 무한 루프나 해제되지 않은 요소 참조와 같은 메모리 누수가 있는지 코드를 직접 확인하세요.
2. JVM 매개변수 -XX:+HeapDumpOutOfMemoryError 및 -XX:HeapDumpPath=<你的path>
를 설정합니다.
3. 메모리 이미지 분석 도구(http://www.eclipse.org/mat/)를 이용하여 메모리 누수인지 메모리 오버플로인지 분석하고, 메모리 누수 상황 다음으로, 유출된 객체가 GC ROOTS와 어떤 관련이 있는지 알아보고, 유출된 코드의 위치를 찾아보세요.
4. 메모리 누수가 없는 경우 머신의 물리적 메모리를 결합하여 힙 메모리(-Xms 및 -Xmx)를 계속 늘릴 수 있는지 확인합니다. 또한 힙 메모리 설정이 클수록 더 나은 이유는 대용량 메모리에서 FULL GC가 발생하면 오랫동안 "stop the world" 메시지가 전송되기 때문입니다. 이는 용납할 수 없는
@letcheng은 그의 관점에 동의합니다. 당신은 웹 프로젝트가 아닌 순수한 Java 프로젝트일 뿐입니다. 얼마나 많은 객체를 생성하고 힙에 OOM을 발생시킬 수 있습니까? 따라서 이는 주로 코드 때문입니다. JDK에는 JConsole.exe 도구가 내장되어 있습니다. 현재 보유하고 있는 개체 수, 힙 메모리 양, OOM이 언제 발생했는지 확인할 수 있습니다.
이런 종류의 문제는 findbug나 sonar와 같은 도구를 사용하여 프로그램을 실행하여 메모리 누수로 인한 메모리 오버플로의 위험이 있는지 확인하는 것이 좋습니다
java.lang.OutOfMemoryError: Java 힙 공간은 힙 메모리의 초기 상태와 오래된 상태입니다. 메모리 공간이 모두 소모되면 발생합니다. 따라서 일반적으로 이 문제는 생성된 메모리로 인해 발생합니다. 가장 일반적인 IO 클래스와 같이 재활용됩니다. 사용 후에는 xx.close()
를 수행하지 마세요.
TOMCAT에서 대용량 메모리를 구성하는 것만으로는 충분하지 않으며, 메모리 누수 문제가 발생하면 아무리 메모리가 커도 소용이 없습니다.
저는 @Founder의 의견에 동의하지 않습니다. OOM이 발생하자마자 힙 메모리의 크기를 변경하기 시작하는 사람들을 많이 보았는데, 힙 메모리를 조정한다고 해서 더 큰 것이 더 좋은 것은 아닙니다.
먼저 지식을 전파하세요.
힙 메모리는 신세대와 구세대로 구분됩니다. 신세대는 GC가 필요한 개체를 저장하는 데 사용됩니다. 일정 기간 이상 GC가 이루어지지 않으면 Old Generation으로 승격되어 저장됩니다.
신세대보다 구세대가 더 넓은 공간을 갖게 될 것이다.
OOM이 발생하면 Old Generation에 메모리가 부족합니다(신세대에 메모리가 부족하면 Old Generation에 배치하여 저장하게 되기 때문입니다).
다음과 같은 방법으로 문제를 분석하고 해결하는 것이 좋습니다.
1. 컬렉션에 무한 루프나 해제되지 않은 요소 참조와 같은 메모리 누수가 있는지 코드를 직접 확인하세요.
2. JVM 매개변수
를 설정합니다.-XX:+HeapDumpOutOfMemoryError
및-XX:HeapDumpPath=<你的path>
3. 메모리 이미지 분석 도구(http://www.eclipse.org/mat/)를 이용하여 메모리 누수인지 메모리 오버플로인지 분석하고, 메모리 누수 상황 다음으로, 유출된 객체가 GC ROOTS와 어떤 관련이 있는지 알아보고, 유출된 코드의 위치를 찾아보세요.
4. 메모리 누수가 없는 경우 머신의 물리적 메모리를 결합하여 힙 메모리(-Xms 및 -Xmx)를 계속 늘릴 수 있는지 확인합니다. 또한 힙 메모리 설정이 클수록 더 나은 이유는 대용량 메모리에서 FULL GC가 발생하면 오랫동안 "stop the world" 메시지가 전송되기 때문입니다. 이는 용납할 수 없는
간단한 해결책은 힙 크기를 조정하는 것입니다
Eclilpse에서 시작 매개변수를 수정하고 VM 인수에 -Xms384m -Xmx384m을 추가하세요
또는
Tomcat의 catalina.bat - Xmx384m에 -Xms384m을 추가
단, 코드를 다시 확인하는 것을 권장합니다
@letcheng은 그의 관점에 동의합니다. 당신은 웹 프로젝트가 아닌 순수한 Java 프로젝트일 뿐입니다. 얼마나 많은 객체를 생성하고 힙에 OOM을 발생시킬 수 있습니까? 따라서 이는 주로 코드 때문입니다.
JDK에는 JConsole.exe 도구가 내장되어 있습니다. 현재 보유하고 있는 개체 수, 힙 메모리 양, OOM이 언제 발생했는지 확인할 수 있습니다.
이런 종류의 문제는 findbug나 sonar와 같은 도구를 사용하여 프로그램을 실행하여 메모리 누수로 인한 메모리 오버플로의 위험이 있는지 확인하는 것이 좋습니다
java.lang.OutOfMemoryError: Java 힙 공간은 힙 메모리의 초기 상태와 오래된 상태입니다. 메모리 공간이 모두 소모되면 발생합니다. 따라서 일반적으로 이 문제는 생성된 메모리로 인해 발생합니다. 가장 일반적인 IO 클래스와 같이 재활용됩니다. 사용 후에는 xx.close()
를 수행하지 마세요.TOMCAT에서 대용량 메모리를 구성하는 것만으로는 충분하지 않으며, 메모리 누수 문제가 발생하면 아무리 메모리가 커도 소용이 없습니다.