Oracle Java를 사용하는 Ubuntu 12.04.3 x64 VPS에서 Java 응용 프로그램을 실행 중입니다. 몇 분이 지나면 OS에 의해 프로세스가 종료됩니다. 콘솔에 "kill"이 나타납니다.시스템 메모리가 고갈 된 후 Java 프로세스가 종료됩니다. 왜?
크래시가 발생하기 전에 TOP (가상 메모리가 몇 기가 바이트)를 사용하여 과도한 메모리 사용량을 볼 수 있습니다. 누출을 검사하기 위해 Java VisualVM을 설치하고 jstatd를 통해 원격으로 연결했습니다. 누수의 흔적은 볼 수 없습니다 :
- 힙 크기 : 10메가바이트
- PermGen 공간의 크기 : 20메가바이트
- 스레드 :로드 5 개
- 클래스 : 815
몇 번 시도한 후에 hs_err_pid7071.log과 hs_err_pid7057.log이 apps 디렉토리에 나타납니다 (링크 됨).
앱에서 사용하는 일부 기본 라이브러리가 있습니다.
jcmd 8749 VM.native_memory detail
을 실행하고 this result을 얻었습니다. VM은 당시 약 2GB의 메모리를 사용하고있었습니다. 이 줄을 제거하면 누수를 만드는
가 사라 :
Kryo kryo = new Kryo();
return kryo.copy(gameWorld);
힙이 아닌 메모리 누수가있는 것 같습니다. 충돌 직전에 힙 덤프를 만들어 이미지 나 파일 핸들과 같은 비 Java 리소스를 찾습니다. –
로그에 스왑 공간이 없다고 기록되어 있습니다. 'free -mt'를 실행하고 그 이유가 무엇인지, 그리고 시스템 문제인지 또는 애플리케이션이 그것을 모두 소비하는지 확인하십시오. – ssedano
스왑 합계 : 0 - 이것이 VPS 구성 방법입니다. 그러나 앱은 처음부터 많은 양의 메모리를 사용해서는 안됩니다. – atok