2011-11-16 5 views
5

그래서 우분투에서 Java 프로세스가 자동으로 종료되고 며칠 째 이유를 알 수 없습니다.뭔가가 우분투에서 Java 프로세스를 계속 죽이고 있습니다. 왜 그런지 알겠습니까?

내 상자에 35.84GB의 RAM이 있습니다. Java 프로세스를 시작할 때 -Xmx28g 매개 변수를 전달하므로 사용할 수있는 최대 RAM 용량보다 작아야합니다. 그러면 jstat 출력의

# jstat -gccause -t `pgrep java` 60000 

마지막 몇 줄의 프로세스가 있었다 사망 직전 :

Time  S0  S1  E  O  P  YGC YGCT  FGC FGCT  GCT  LGCC     GCC 
14236.1 99.98 0.00 69.80 99.40 49.88 1011 232.305 11 171.041 403.347 unknown GCCause  No GC 
14296.2 93.02 0.00 65.79 99.43 49.88 1015 233.000 11 171.041 404.041 unknown GCCause  No GC 
14356.1 79.20 0.00 80.50 99.55 49.88 1019 233.945 11 171.041 404.986 unknown GCCause  No GC 
14416.2 0.00 99.98 24.32 99.64 49.88 1024 234.945 11 171.041 405.987 unknown GCCause  No GC 

이가에 내려 가서 무엇을 것 같다/다음과 같이

나는 그러면 jstat 실행 var/log/syslog : https://gist.github.com/1369135

내 Java 응용 프로그램 이외의 다른 서버에서는 실행중인 내용이 없습니다. 무슨 일이야?

편집 : 저는 Java 버전 1.6.0_20을 실행 중이며 시작시 Java에 전달하는 유일한 주목할만한 매개 변수는 "-server -Xmx28g"입니다. 나는 응용 프로그램 서버를 사용하지 않지만 내 응용 프로그램은 "간단한 웹 프레임 워크"를 포함합니다.

+0

최대 물리적 RAM은 프로세스에서 사용할 수있는 양과 동일하지 않습니다. Eric Lippert는이 . 나는 그 게시물이 Windows/.NET 중심이라는 것을 알고 있지만, 또한 철저히 정리하고있다. 호기심에서 벗어나 OutOfMemoryError를 잡아서 로그를 기록하여 이것이 원인인지 확인/거부 할 수 있습니까? –

+1

나는 stomout과 stderr를 로깅하고 있는데, 나는 OOM이 어디로 갈 것인지를 믿는다. 그리고 나는 OOM 예외를 나타낼만한 것을 보지 못한다. 나의 경험으로 OOM은 앱을 죽이지 않고 끝내게된다. 이 경우 앱이 OS에 의해 삭제 된 것 같습니다. – sanity

답변

5

(두 번째 시도).

OOM 킬러가 문제라고 가정하면 심각한 메모리 부족 문제로 OS를 계속 작동시키려는 절박한 시도로 프로세스가 중단되었습니다.

그 결론을 내릴 것 :

  • 당신의 JVM 실제로 28GB보다 훨씬 더 많이 사용하고 있습니다; 즉 힙이 아닌 메모리를 많이 사용하고 있으며

  • OS에 적절한 스왑 공간이 구성되어 있지 않습니다.

OS가 긴급 상황에서 응용 프로그램의 일부를 교체 할 수 있도록 스왑 공간을 추가하려고합니다.

또는 JVM의 힙 크기를 줄이십시오. "-Xmx는 ..."최대 힙 크기, 당신의 JVM이 사용할 수있는 메모리가 아닌 최대 크기를 설정하는 것을


참고. JVM은 응용 프로그램에서 사용하는 스레드 스택 및 메모리 매핑 파일 용 메모리를 포함하여 힙 외부에 몇 가지 항목을 넣습니다.

+1

링크 된 시스템 로그는 어떤 방식으로 그렇게 말합니까? 콘솔은 java가 종료되었다고 말하면서 종료되지 않았다고 말합니다. 메모리가 부족하면 일반적으로 OutOfMemory 예외가 발생합니다. 수백 킬로바이트의 개체를 저장해야하기 때문에 엄청난 양의 RAM이 필요합니다. 각 개체에는 수 킬로바기의 RAM이 필요합니다. – sanity

+0

@sanity - 다시 읽으십시오 ... –

+0

다른 조언에 따라 최대 메모리 사용량을 15GB로 줄이고 있습니다. – sanity

1

와우, 실제로 28 GB의 힙을 사용할 수 있습니까?! 당신이 그것을 줄이려고 시도해도 좋을지 생각합니다. 그래서 생각하는 RAM의 50 % 이상을 유지하십시오. (그래서 ~ 18 GB 또는 심지어 15 GB 일 수도 있습니다.) 플러스 171 풀 GC가 많이 있습니다! 이 앱이 얼마나 오래 실행 되었습니까? 171 일에서 2 ~ 3 일 소리가 커. btw 요점은 종료 전에 OOM을 나타냅니다 - 나는 힙을 줄이는 것이 수정 될 것이라고 생각합니다 (JVM이 기본 공간을 확장하는 것을 제한 할 수 있음). 다양한 매개 변수를 조정 해보고 필요하면 스택 크기 (예 : -Xss)를 시도하십시오. 최대 허용 크기 및 기타 섹션도 확인하십시오. 메모리 문제이며 반드시 힙일 필요는 없습니다.

+0

oops misread, 실제로 11 개의 풀 GC,하지만 여전히 꽤 많이 있습니다. 그것의 확실히 OOM 및 힙 크기를 줄이기 위해 시도해야합니다. – aishwarya

+0

죄송합니다. 요지가 OOM을 나타내는 곳을 보지 못했습니다. 프로세스의 stdout 또는 stderr에 OOM이 표시되지 않습니다. -/전체 힙이 RAM의 50 % 만 사용하는 것이 중요한 이유는 무엇입니까? 분명히 -Xmx는 Java가 사용할 최대 RAM을 지정합니까? – sanity

+0

또한 힙 크기 * 감소 * OOM의 가능성을 줄이지는 않습니까? – sanity

2

어떤 JVM을 사용하고 있습니까? 어떤 응용 프로그램 서버입니까? 너무 많은 메모리를 할당 할 가능성이 있으며 문제가 될 수 있습니다. 가비지 수집기가 작업을 수행하는 데 어려움을 겪을 수 있습니다.

이 경우에 대한 확신이 없지만 리눅스가 메모리를 과장하는 방식을 설명하는 매우 흥미로운 내용의 this 문서를 발견했습니다.

+0

요청한 정보로 내 질문이 업데이트되었습니다. – sanity

6

OOM-killer에 오신 것을 환영합니다.이 기능은 모든 곳에서 대용량 메모리 응용 프로그램의 한계가되는 '기능'입니다. 거래 할 간단한 제조법은 없으며, 그냥 Google로 읽고 독서와 무기를 시작하십시오.

OOM 킬러의 심혈을 간결하게 설명 할 수는 없지만 중요한 조정 매개 변수는 'swappiness'라고합니다. 우리의 큰 서버 중 하나에, 우리는이 :

/etc/sysctl.conf:vm.swappiness=20

을 읽기 http://www.gentooexperimental.org/~patrick/weblog/archives/2009-11.html.

+0

수 있습니까? 왜 OOM-killer가 35GB RAM을 갖춘 컴퓨터에서 28GB만을 사용하는 응용 프로그램을 죽이고 기본적으로 다른 프로세스가 실행되지 않는지 요약합니다. – sanity

+0

참조 http://stackoverflow.com/questions/15237067/how-do-i-configure-oom-killer – yegor256

관련 문제