2014-01-11 2 views
0

Oracle Java를 사용하는 Ubuntu 12.04.3 x64 VPS에서 Java 응용 프로그램을 실행 중입니다. 몇 분이 지나면 OS에 의해 프로세스가 종료됩니다. 콘솔에 "kill"이 나타납니다.시스템 메모리가 고갈 된 후 Java 프로세스가 종료됩니다. 왜?

크래시가 발생하기 전에 TOP (가상 메모리가 몇 기가 바이트)를 사용하여 과도한 메모리 사용량을 볼 수 있습니다. 누출을 검사하기 위해 Java VisualVM을 설치하고 jstatd를 통해 원격으로 연결했습니다. 누수의 흔적은 볼 수 없습니다 :

  • 힙 크기 : 10메가바이트
  • PermGen 공간의 크기 : 20메가바이트
  • 스레드 :로드 5 개
  • 클래스 : 815

몇 번 시도한 후에 hs_err_pid7071.loghs_err_pid7057.log이 apps 디렉토리에 나타납니다 (링크 됨).

앱에서 사용하는 일부 기본 라이브러리가 있습니다.

jcmd 8749 VM.native_memory detail을 실행하고 this result을 얻었습니다. VM은 당시 약 2GB의 메모리를 사용하고있었습니다. 이 줄을 제거하면 누수를 만드는

가 사라 :

Kryo kryo = new Kryo(); 
return kryo.copy(gameWorld); 

Documentation of this method

+0

힙이 아닌 메모리 누수가있는 것 같습니다. 충돌 직전에 힙 덤프를 만들어 이미지 나 파일 핸들과 같은 비 Java 리소스를 찾습니다. –

+0

로그에 스왑 공간이 없다고 기록되어 있습니다. 'free -mt'를 실행하고 그 이유가 무엇인지, 그리고 시스템 문제인지 또는 애플리케이션이 그것을 모두 소비하는지 확인하십시오. – ssedano

+0

스왑 합계 : 0 - 이것이 VPS 구성 방법입니다. 그러나 앱은 처음부터 많은 양의 메모리를 사용해서는 안됩니다. – atok

답변

0

나는 당신의 HS에이 줄을 참조 * 파일 :

메모리 : 4K 페이지, 물리적 502752k (무료 372080k), 교환 0k (0k 무료)

사실인가요? 귀하의 컴퓨터는 약 370M의 여유 메모리 만 가지고 있습니까? 그리고 "jvm_args : -Xms1g"로 JVM 프로세스를 시작하려고합니까? 이 1G의 어디에서 올 수 있었습니까?

관련 문제