2012-02-27 6 views
1

코드가 HashMap이므로 메모리가 누출됩니다. 처음 응용 프로그램에 로그인하면이 HashMap이 채워지고 일부 데이터를 캐시하려면이 Map을 사용합니다.HashMap으로 인한 메모리 누출

저는이 캐시 된 데이터를 응용 프로그램의 여러 위치에 사용했습니다.

응용 프로그램에서 아무것도 실행되지 않으면 로그인 후에 크기가 계속 커집니다. 가비지 컬렉터가 자동으로 호출 될 때만 크기가 줄어들거나 그걸 호출합니다.

그러나 그 후에 다시 증가하기 시작합니다. 확실히 메모리 누출이지만 어떻게 피할 수 있습니까?

또한 내 프로필러는 ResultSet.getString()Statement.execute()을 핫스팟 메모리 할당으로 표시합니다. 이 메소드는이 캐시를 채우는 데 사용됩니다.

이러한 방법 때문에 메모리 누수가 있습니까? 마지막으로 DB 연결을 닫습니다.

왜 아직도 이러한 방법을 보여 줍니까?

+7

가비지 컬렉터가 문제의 메모리를 수집 할 때 어떻게 메모리 누수가 될 수 있습니까? – jalf

+0

모르겠지만 GC 후에 메모리 사용량이 줄어들었지만 시간이 지나면 다시 응용 프로그램에서 아무것도 실행되지 않을 때 빠르게 증가한다는 것을 알게되었습니다. 메모리 누수가 아닙니까 ?? –

+7

두 개 이상의 물음표를 사용하여 질문을 나타낼 필요가 없습니다. '??'는''보다 ''더 많은 질문을하지 않는다. 그리고 pelase는 질문 **을 굵게 표시하지 않습니다 **. 마찬가지로 '코드 마크 업'은 실제 * 코드 *에만 사용해야합니다. 당신이 강조하고 싶은 작품 뿐만이 아닙니다. 다른 사람들이 귀하의 질문을 더 쉽게 읽을 수 있도록하기 위해이 규칙을 따르십시오. 감사합니다 – jalf

답변

3

위의 설명에 설명되어 있듯이, 이것은 메모리 누출처럼 들리지 않습니다.

Java 응용 프로그램에서 JVM은 객체를 만들고 메모리를 사용합니다. 시간이 지남에 따라 일부 개체는 범위를 벗어나 (가비지 수집 대상이 됨) 다음 컬렉션이 발생할 때까지 '메모리를 사용하여'힙에 남아있게됩니다. 이것은 문제가되지 않습니다, 그것은 자바가 작동하는 방법입니다. JVM이 메모리를 확보해야한다고 결정하면 컬렉션을 실행하고 사용 된 메모리가 떨어집니다.

당신이보고있는 것에 관심을 가져야합니까? 나는해야하는 두 가지 이유와 왜 그렇게해서는 안되는가를 생각할 수 있습니다. 가비지 콜렉션이 애플리케이션을 실행하기에 충분한 메모리를 확보하면 콜렉션은 성능에 영향을 미치지 않으며 다른 일을 할 수있는 분주한 사람입니다. 그렇다면 신경 써야 할 이유가 없습니다.

그러나 응용 프로그램이 어떻게 작동하는지 이해하지 못하거나 "너무 많은 메모리"가 문제가되는 이유가 걱정된다면 (앞으로 더 많은 데이터로 응용 프로그램을 실행하고 싶을 것입니다 , 또는 미래에 할당 된 힙을 줄여서 실행하려는 경우) 조사를 원할 수 있습니다.

응용 프로그램이 아무 것도하지 않을 때 메모리를 모두 사용했다면, 나는 그것에 집중할 것입니다. 그것이 '아무것도'하지 않을 때 실제로 무엇을하고 있습니까? 내가 뭔가를하고 있다고 내기

+0

아무것도하지 않으면 시스템에 성공적으로 로그인했음을 의미하지만, 캐시가 성공적으로 채워지지만 언젠가는 기다리고 다시 볼 때 메모리가 계속 증가하고 있음을 의미합니다. –