2011-10-05 6 views
1

일부 메모리 누수를 찾기 위해 하나의 자바 코드베이스를 검토 중입니다. 검토하는 동안 나는 다음과 같은 시나리오를 발견했다.자바 정적 멤버 메모리 누수

  1. 클래스 1은 코드베이스에 있습니다. Class1에는 인스턴스 변수와 정적 멤버가 있습니다. Class1의 인스턴스를 만드는 다른 클래스. 이 시나리오로 인해 메모리 누수가 발생합니까?
  2. 클래스 2는 코드베이스에서 사용할 수 있습니다. 정적 인 내부 클래스가 있습니다. 정적 내부 클래스의 인스턴스는 다른 정적 내부 클래스에서 생성됩니다. 메모리 누수가 발생합니까? 예를 들어, 누군가가 답을 줄 수
Class2 { 
    public static class Class3 { 
    } 
    public static class Class4 { 
    } 
    public static class Class3 { 
     Class3 c = new Class3(); 
     //…. 
    } 
    public static int doSomething1{ 
    } 
    public static void doSomething2{ 
    } 
    public void doSomething3{ 
    } 

} 

?

답변

3

다른 클래스의 인스턴스를 만들면 메모리 누수가 발생하지 않습니다.

필요 이상으로 참조를 유지하면 메모리 누수가 발생합니다.

이러한 참조는 명시 적이거나 묵시적 일 수 있습니다. 예를 들어, 정적이 아닌 내부 클래스의 인스턴스를 만든 경우 명시 적 참조가없는 경우에도 외부 인스턴스에 대한 참조가 유지됩니다.

귀하의 직접적인 질문에 대한 대답은 확실합니다 : 일 수 있습니다. 더 많은 정보를 제공해야합니다.

그리고 : 메모리 누수를 찾는 꽤 좋은 도구는 프로파일 러를 사용하는 것입니다. 특히 그것이 인 경우 메모리 누출이 큽니다.

1

일반적으로 정적 멤버는 null로 설정할 때까지 해제되지 않습니다. 인스턴스 변수는 인스턴스 자체에 도달 할 수없는 경우 해제됩니다. 정적 내부 클래스는 일반 클래스와 같으므로 위의 규칙을 따릅니다.

정적이 아닌 내부 클래스는 @Joachim Sauer의 설명과 같습니다.

p.s. 프로파일 러를 사용하는 방법을 배우면 나머지 프로그래밍 인생에 도움이됩니다.

1

메모리 누수 문제가 있습니다. 동료는 메모리 프로파일 링 도구 http://www.eclipse.org/mat/을 권장했습니다.

저는 자바 마스터가 아니며 닫히지도 않습니다. 하지만 내가 한 일은 내 코드를 실행하고 프로그램이 추락 할 때 (메모리 부족) 모니터 한 다음 코드를 다시 실행하지만 이번에는 명령 줄 옵션 -Xmx을 사용하여 프로그램을 중단시킵니다.

또한 -XX:+HeapDumpOnOutOfMemoryError을 추가 한 다음 프로그램이 손상되면 프로파일 링 도구를 사용하고 힙 덤프를 프로파일 링합니다.

불쾌한 변수/개체를 찾을 수있었습니다. 도움이되는 희망, 행운을 빌어 요!