2012-09-21 2 views
2

팀,런타임시 힙/스택의 객체에 대한 얼마나 많은 강력한 참조를 찾는 방법

Java에서 현재 사용 가능한 객체에 대한 활성/강력한 참조 수를 알 수 있습니까?

예를 들어, 아래 코드에서; 클래스 A의 객체는 프로젝트의 여러 클래스에서 보유 할 수 있습니다. 하지만 모니터 스레드에서 인쇄하고 싶습니다.

public class A { 
    public static A a = new A(); 
    public static A getInstance() { 
    return a; 
    } 

    private A() { 
    new Monitor(this).start(); 
    } 


    class Monitor extends Thread { 
     A refA; 
     public Monitor(A ref) { 
     this.refA = ref; 
     } 
     public void run() { 

     //TODO Print how many references currently available for Object A referenced by refA; 
     //Sure It will be minimum one. (which is "a" in this class A) 
     } 

    } 
} 

이 예제 프로그램을 중요하게 생각하지 마십시오. 내 질문은 얼마나 많은 강력한 참조를 힙/스택에서 개체를 사용할 수 찾으려면 무엇입니까? 좋은 점은 우리는 그 대상에 대한 강력한 참고 자료가 있다는 것입니다.

자바에서 가능하지 않은 경우; 이 강력한 참조를 C 언어에 전달할 수 있습니까? C 언어에서 할 수 있습니까?

프로필러/도구가 어떻게 이런 일을 할 수 있는지 궁금합니다. 도와주세요.

+0

왜 런타임에 자바에서 객체에 대한 참조를 얼마나 많이 찾고 싶습니까? –

+0

getInstance()를 호출 한 후 활성 참조가 하나만있을 때 어떤 동작을 실행하려고합니다. getInstance()의 호출 원 메서드가 스택 내에서 종료하고있는 것을 나타냅니다. 따라서 'a'라는 활성 참조가 하나만 있습니다. –

+0

일종의 Aspect 기능이 필요한 것처럼 보입니다. AspectJ 또는 Spring AOP를 사용해보십시오. –

답변

0

아니요 VM의 클래스 또는 분기 도구를 변경하지 않고 정확한 개수를 얻을 수는 없습니다 (성능에 영향을 미치기 때문에 프로덕션 환경에서는 거의 만들 수 없습니다).

the ref package을 사용하면 개체가 garbaged (이 시점에서 작동)하고 있지만 사용할 수있는 카운트가없고 (항상 VM에서 처리되는 것은 아닙니다) 알림을받을 수 있습니다.

+0

좋아요. 프로파일 러/툴이 어떻게 할 수 있는지 말해 주시겠습니까? C 언어에서 가능합니까? 그렇다면 네이티브 콜을 사용할 수 있습니까? –

+1

현대 JVM은 인스턴스 수를 유지하지 않기 때문에 성능에 심각한 영향을 미치지 않고이 작업을 수행 할 수 없습니다. –

+0

감사합니다. Peter Lawrey와의 회심에 대해 제안 해 주시겠습니까? –

0

힙 덤프를 수행하고 분석하여 개체에 대한 참조 수를 찾을 수 있습니다.

이 작업을 수행하기위한 귀하의 요구 사항은 무엇이며 원하는 정보를 얻는 방법이 더 쉽고/더 나은 것으로 의심되는 정보를 어떻게 처리 할 것입니까?


당신은 나는 이것이 당신이 코드를 사용하여 클래스의 참조를 conting에 얻을 수있는 가장 가까운 생각이

Class A 
{ 
    static int instanceCount = 0; 
    public A() 
    { 
     instanceCount++; 
    } 

    protected finalize() 
    { 
     instanceCount--; 
    } 

    public static int getInstanceCount() 
    { 
     return instanceCount; 
    } 
} 

처럼 뭔가를해야만을 시도 할 수의 WeakHashMap

/** 
* Reference queue for cleared WeakEntries 
*/ 
private final ReferenceQueue<Connection> queue = new ReferenceQueue<>(); 

List<WeakReference<Connection>> usedConnections = .... 

// when you have a new connection 

Connection connection = .... 
usedConnections.add(new WeakReference(connection, queue)); 

// checking the queue for discarded objects. 

    // remove null references from usedConnections 

    for (Connection x; (x = queue.poll()) != null;) { 
     synchronized (queue) { 
      x.close(); 
     } 
    } 
+0

약 700 개의 코드 DB 연결 개체가 수영장에서 요청되었습니다. 그러나 그들은 결코 닫히지 않았습니다. 이것은 max_no_connection_size가 75이기 때문에 나타나지 않습니다.로드 테스트 중에 만 발견됩니다. 난 단지 대신 모든 파일에 코드 변경을하는 솔루션을 원한다. 수영장 옆에 어떻게 닫을 수 있습니까? –

+0

메모리 누수가있는 것 같습니다. 메모리 프로파일 러를 사용하여 어디에서 유지되는지 확인할 수 있습니다. PreparedStatements와 같은 JDBC 리소스를 닫고 있습니까? –

+0

그 코드는 연결을 단 한 곳이라도 닫지 않았습니다. 이제는이 700 개 장소로 모두 변경하기가 어렵습니다. 어떤 제안을 어떻게하면이 문제를 해결할 수 있을까요? –

-1

를 기준으로합니다. 희망이 도움이 ...

+0

당신이 알고 있기를 희망한다. 코드의 getInstance() 호출자 메소드 블록이 끝나면 참조가 종료됩니다. 런타임시 호출되는 getInstance()의 수와 결코 같지 않습니다. 또한 우리는 살아있는 객체의 참조에 대해서 이야기하고 있기 때문에 finalize()도 도움을 얻을 수 없습니다. 위의 예제에서 –

+0

은 하나의 ClassLoader에 대해 인스턴스 카운트가 항상 1입니다. 이제는 JVM에서 다른 클래스 로더에 의해로드 된 동일한 클래스가 다른 클래스로 취급됩니다. 그래서 귀하의 경우 인스턴스 수 = 클래스 A를로드하는 클래스 로더의 수입니다. –

관련 문제