2011-01-02 1 views
1

일부 결정 모듈을 통해 파일 배치를 처리해야하는 Java 응용 프로그램을 실행 중입니다. 약 50 시간 동안 배치를 처리해야합니다. 내가 직면하고있는 문제는 프로세스가 약 1 시간 동안 정상적으로 실행 된 다음 유휴 상태가되기 시작한다는 것입니다. JVM을 한 시간 동안 실행 한 다음 종료하고 30 분 후에 JVM을 다시 시작하지만 두 번째 실행에는 거의 4-5 시간이 걸립니다. 1 시간 만에 첫 번째 달리기를하는 것. 어떤 도움이나 통찰력이라도 대단히 감사하겠습니다.jvm shutdown 후에도 메모리가 사용 중입니다. 어떻게 해 제합니까?

저는 64 비트 Windows r2 서버, 2 개의 인텔 쿼드 코어 프로세서 (2.53 GHz), 24 GB RAM에서 실행하고 있습니다. Java 버전은 1.6.0_22 (64 비트)이고 응용 프로그램에 할당 된 메모리는 힙 (16GB) 및 PermGen (2GB)입니다.

외부 모듈도 jvm에서 실행 중이며 종료 중입니다.하지만 시스템 종료 후에도 메모리를 계속 잡고 있다고 느낍니다. 내가 jvm을 사용하기 전에 RAM 사용량은 1GB입니다. 끝내면 약 3GB로 유지되는 경향이 있습니다. JAVA가 강제로 메모리를 해제하도록 요청할 수있는 방법이 있습니까?

+0

자유로운 JVM 메모리를 다루는 OS라고 생각합니다. put을 통해 파일 IO를 확인 했습니까? 때로는 큰 파일 쓰기로 인해 유휴 상태 또는 느려집니다. 하드 디스크 공간에 큰 변화가 있습니까? 외부 모듈이란 무엇입니까? naitve 도서관? 응용 프로그램에서 멀티 스레딩을 사용합니까? 아마도 스레드 잠금? – gigadot

답변

3

닫으려고하는 JVM이 정말로 닫혀 있습니까?

일단 프로세스가 종료되면 할당 된 모든 RAM은 더 이상 할당되지 않습니다. 일단 프로세스가 종료되면 프로세스가 중단 될 수있는 방법이 없기 때문에 프로세스가 종료되도록 지시 할 방법이 없습니다. 이것은 운영 체제에 의해 수행됩니다.

솔직히 말해서 JVM이 여전히 실행 중이거나 RAM을 먹고있는 것처럼 들립니다. 또한 그것을 사냥하고 죽이는 대신에 악의적 인 버그를 해결하려고하는 것처럼 들립니다.

+0

예, JVM이 오류없이 매우 정상적으로 종료됩니다. 외부 모듈이 JVM의 범위 밖에있는 원시 힙을 사용하고있는 것처럼 느껴집니다. (외부 모듈도 동일한 JVM에서 실행됩니다.) 내가 이것을 말하는 이유는 프로세스를 시작하기 전에 컴퓨터의 RAM 사용량이 1Gb이고 JVM을 중지 한 후 오랜 시간이 걸리기 때문입니다 (JVM이 실행될 때의 사용량은 약 8GB 임) 약 3GB로 유지됩니다.외부 모듈을 수정하지 않고이 리소스를 해제 할 수 있습니까? – user560174

+0

"원시 힙"같은 것은 없습니다. 프로세스의 메모리 (JVM이든 아니든)는 종료되면 항상 할당되지 않습니다. JVM이 종료되었다고 어떻게 말할 수 있습니까? 어떤 프로세스가 메모리를 소비하는지 어떻게 알 수 있습니까? 작업 관리자에서 실제로 메모리를 소비하는 프로세스와 java.exe (또는 javaw.exe) 프로세스가 없는지 확인 했습니까? – abyx

+0

예 jvm이 작업 관리자를 종료 할 때 더 이상 java.exe 또는 javaw.exe가 – user560174

0

JVM이 전혀 종료되지 않는 것 같습니다. OutOfMemoryExceptions으로 중단되는 JBoss 인스턴스로이 증상을 정기적으로 봅니다. JVM을 죽일 때 (SIGTERM/SIGQUIT를 통해) JVM은 OOM 예외를 처리/처리하는 모든 리소스를 소비하기 때문에 적시에 종료하지 않습니다.

로그와 프로세스 테이블을 신중하게 확인하여 JVM이 올바르게 종료되는지 확인하십시오. 이 시점에서 OS는 해당 프로세스와 관련된 모든 리소스 (소비 된 메모리 포함)를 지 웁니다.

+0

예, JVM이 오류없이 매우 우아하게 종료됩니다. 외부 모듈이 JVM의 범위 밖에있는 원시 힙을 사용하고있는 것처럼 느껴집니다. (외부 모듈도 동일한 JVM에서 실행됩니다.) 내가 이것을 말하는 이유는 프로세스를 시작하기 전에 컴퓨터의 RAM 사용량이 1Gb이고 JVM을 중지 한 후 오랜 시간이 걸리기 때문입니다 (JVM이 실행될 때의 사용량은 약 8GB 임) 약 3GB로 유지됩니다. 외부 모듈을 수정하지 않고이 리소스를 해제 할 수 있습니까? – user560174

0

나는 그 과정에서 어떤 것을 발견했습니다.

JVM을 종료 한 후 파일 시스템에 쓴 모든 파일을 삭제하면 RAM 사용량이 원래 1GB로 돌아갑니다.

이것은 무엇인가로 인도합니까? 그리고 아마도 그것에 대해 뭔가 할 수 있습니다.

+0

OS에서 제공하는 방법을 사용하여 파일을 삭제하는 경우. 명령 행 또는 gui, OS 버그가 있어야합니다. 이럴 가능성은 희박합니다. 많은 파일 (10 억)을 생성하고 파일을 닫는 것을 잊었습니까? Java 응용 프로그램 또는 기본 라이브러리 내의 IO 스트림을 닫으시겠습니까? – gigadot

+0

약 1 백만 개의 파일에 대해이 작업을 수행하고 있으며 닫는 중입니다. 왜 메모리에 매달려 있는지 이해할 수 없습니다. – user560174

0

관심 분야 : 병렬로 실행할 수 있도록 프로세스 분할을 시도 했습니까?

50 시간 직업은 큰 직업입니다! 당신은 거기에 괜찮은 기계 (8 코어와 24GB 램)을 가지고 있고 그것의 일부를 병렬 처리 할 수 ​​있어야합니다.

+0

다중 스레드 프로세스이며 2 개의 프로세스가 실행 중입니다. – user560174

+0

또한이 일을하는 4 대의 컴퓨터가 있지만 여전히 50 시간 동안 실행해야합니다. – user560174

+0

JVM을 종료 한 후 파일 시스템에 쓴 모든 파일을 삭제하면 RAM 사용량이 다시 원본 1GB. 이것은 무엇인가로 인도합니까? 그리고 아마도 그것에 대해 뭔가 할 수 있습니다. – user560174

관련 문제