2012-02-21 3 views
10

질문은 기본적으로 제목에 포함되어 있습니다.JVM은 -Xmx 한도에 도달하면 가비지 수집을 강제합니까?

JVM -Xmx 한도에 도달 한 애플리케이션이 있다고합시다. 그 응용 프로그램이 더 많은 메모리를 필요로 할 때 가비지 콜렉션이 강제 실행됩니까? (HotSpot JVM에서)

설명 할 수없는 두 번째 이상한 점은 현재 -Xmx = 2048m으로 실행되는 응용 프로그램 서버가 있다는 것입니다. "top"명령 (Linux에서)은 2.7g을보고합니다. 방법.

그래서 언제/-Xmx를 초과 할 수있는 응용 프로그램입니까?

감사합니다, 당신은 여전히 ​​메모리를 찾을 수없는 경우

+1

'2048' -Xmx = 2048 바이트이다

여기서 메모리 할당을 설명하는 좋은 문서이다. 나는 당신이'-Xmx = 2048m'을 의미한다고 가정한다고 가정한다. 주 : 똑같은'-mx2g' 만 쓸 수있다. –

+0

@ PeterLawrey 고마워, 네, 2048m을 의미했습니다. 질문을 수정했습니다. – Simeon

답변

11

실제로 생존자 공간에 남아있는 공간이 없으면 전체 생성 (전체 힙이 아님) 및 주요 GC가 트리거 될 때 정상 GC가 트리거되므로 일부 개체를 이전 세대로 마이그레이션해야합니다.

+2

+1 : 일반적으로 Full Tenured Space는 Full GC를 트리거합니다. 사소한 콜렉션은 대개 생존자 공간 확보를 피하기 위해 종전의 공간으로 물체를 이동시켜 공간을 채 웁니다. –

+2

'-Xmx'는 최대 힙 크기 만 설정합니다. 이것은 종종 가장 큰 영역이지만 유일한 영역은 아닙니다. 스레드 스택, 직접 메모리, 공유 라이브러리, JVM 자체 등이 있습니다. –

1

네, OUTOFMEMORY 오류가 발생합니다. 나는 이것을 이렇게 이해합니다.

3

GC는 일반적으로 사용하는 가비지 수집기에 따라 훨씬 더 빨리 트리거되지만 일반적으로 그렇습니다.

1

IIRC 보장은 전체 GC가 이 던져지기 전에 수행된다는 것입니다. 힙 크기 제한을 초과하면 이러한 오류가 발생하므로 제한에 도달하면 항상 하나 이상의 전체 GC가 실행됩니다.

3

예, JVM은 힙 한계 (그리고 훨씬 빨라짐)에 도달하면 확실히 GC를 호출합니다. 도움이되지 않으면 OutOfMemoryError 초가 걸립니다.

프로세스 메모리가 더 많이 소비되는 이유는 -Xmx 옵션이 Java 힙 공간 (Java 객체가 할당 된 위치) 만 제한한다는 것입니다. 스레드 스택을위한 공간, 클래스와 코드가 저장되는 "PermGen", ByteBuffers을 통해 할당 된 "직접"메모리, 네이티브 라이브러리에 의해 할당 된 메모리 등 JVM에서 사용되는 몇 가지 다른 메모리 영역이 추가로 있습니다. 이러한 추가 메모리 영역 중에는 -Xss과 같이 제한 할 수있는 다른 구성 옵션이 있지만 일부는 JVM을 제어 할 수 없습니다.

0

가비지 콜렉션은

한 가지 -Xmx는 최대 힙 크기를 설정하는 것입니다 알고 있어야 (다른 종류가 있습니다)뿐만 아니라이 매우 큰 지역이다,하지만 당신이 말하는 것은 전체 컬렉션에 대한 올바른 minum 힙 크기 인 -Xms. 최소 구성만으로 응용 프로그램이 시작될 수 있습니다. 그런 다음 사용 된 메모리가이 값에 도달하면 전체 가비지 수집을 트리거하고 최소 (-Xmx)에서 최대 값 (-Xmx)보다 작은 값 또는 최대 값까지 사용 가능한 힙의 양을 늘립니다. 최대에 도달 할 때까지 여러 번 발생할 수 있습니다. 그 후에는 더 이상 힙을 늘릴 수 없지만 최대 값에 도달하면 가비지 콜렉션이 계속 발생합니다.

7

Xmx 매개 변수는 힙의 크기 만 지정합니다. 힙은 Java 프로세스의 한 부분 일 뿐이므로 Java 프로세스에는 더 많은 메모리가 필요합니다. Java 프로세스에 네이티브 라이브러리, 퍼미션 gen 및 응용 프로그램에서 생성 한 네이티브 메모리 할당과 같은 다른 것들이 포함되어있을 것입니다. http://www.ibm.com/developerworks/java/library/j-nativememory-linux/

관련 문제