2012-06-12 2 views
0

프로덕션 환경에 배포 된 애플리케이션을 일부 메모리 누수로 인해 OutOfMemory 예외가 발생하는 경우가 있습니다. 그것은 우분투 상자에서 visualvm, jconsole 등을 원격으로 연결하지 않는 것을 선호하는 상자에서 실행됩니다. jvm을 gc로 만들 수있는 방법이 있나요? (예를 들어 버튼을 클릭하기 만하면되는 visualvm에서와 같이).가비지 수집을 외부에서 수행하는 방법

나는 jmap -histo:live <pid>을 실행하고이 gc 명령을 실행하여 gc에서 살아남은 개체를 찾습니다. 어느 개체 번호가 커지고 있는지 등. 예기치 않은 개체 수를 볼 수는 있지만 많은 도메인 개체에 걸쳐 일어나고 있으므로 지연된 gc인지 메모리 누수인지 확실하지 않습니다.

간단히 말해서, 나는 linux 명령이 jvm pid에 대해 실행되어 gc를 수행하도록합니다. system.gc가 아닙니다.

+2

[가능한 방법은 셸에서 가비지 수집을 강제로 수행 하시겠습니까?] (http://stackoverflow.com/questions/3523837/how-do-you-force-garbage-collection-from-the-shell) – NPE

+2

메모리 누수로 메모리가 부족하면 gc를 실행해도 도움이되지 않습니다. gc가 "죽은"객체를 숨길 수 없기 때문에 메모리 누수가 발생합니다. 숨겨진 참조가 있기 때문입니다. – Jochen

+0

예는 중복 된 것처럼 보입니다. 링크를 가져 주셔서 감사합니다. q를 검색/입력 할 때 나타나지 않습니다. – Abe

답변

0

Java에서 실제 메모리 누수가 발생하는 것은 pretty hard입니다. 메모리 부족 오류가 발생하면 실제로 메모리가 부족하다는 의미입니다. 따라서이 문제를 해결하려면 사용하지 않는 개체에 대한 참조를 찾아 수동으로 정리해야합니다. 그렇지 않으면 가비지 컬렉터가 낭비되는 메모리를 확보 할 수 없기 때문입니다.

JVM에서 더 이상 메모리를 할당 할 수 없으면 가비지 수집기가 자동으로 실행됩니다.

+0

Java로 작업한지 얼마되지 않았습니다.이 질문은 꽤 오래되었지만이 정보는 정확하지 않습니다. 적어도 Java 5까지는 오브젝트 풀, 복잡한 데이터 구조 또는 프레임 워크 간의 상호 작용으로 작업 할 때 오브젝트간에 순환 종속성을 쉽게 얻을 수있었습니다. JVM 검사 도구를 사용하는 방법을 익히십시오.이 도구는 사용자에게 큰 도움이되며 프로덕션 환경에서 JVM 메모리 문제가 발생할 것입니다. –

2

힙이 가득 차면 GC가 참조되지 않는 개체를 적극적으로 정리합니다. 그래서 그 "지연 gc". 나는 당신이 올바른 길을 가고 있다고 생각하고, jmap을 사용하고 힙 덤프를 얻는다. 그런 다음 분석해서는 안되는 응용 프로그램 개체가 생존하고 있는지 확인하십시오. 몇 힙 덤프를 가져와 서로 비교해야 할 수도 있습니다.

관련 문제