2012-06-14 2 views
3

내 응용 프로그램에서 많은 처리가 일어나기 때문에 개체에 따라 예외가 발생하는 경우가 있습니다. 이제 나는 그 대상의 전체 역사를 알고 싶다. 응용 프로그램이 시작된 이후로 일정 기간 동안 해당 객체로 인해 발생한 모든 작업을 의미합니다.개체의 기록을 가져 오거나 개체를 추적 할 수있는 방법은 무엇입니까?

어쨌든 JMX 나 다른 것을 사용하여이 History of Object에 대해 엿볼 수 있습니까?

감사합니다.

+0

'로깅'이라고합니다. – EJP

답변

1

표준 Java (또는 알고있는 다른 프로그래밍 언어)에서는 불가능합니다. 응용 프로그램에 충분한 로깅을 추가하면 어떤 일이 발생했는지 알 수 있습니다. 또한 방법을 모르는 경우에는 IDE 디버거를 사용하는 방법을 배우십시오. 한 마디로

2

:

JVM이 가비지 컬렉션과 관련된 약간의 정보를 제외하고, 현재 상태로 과거의 모든 개체에 어떤 기록을 보존하지 않습니다 몇 단어와 아니

아마도 HotSpot 옵티 마이저에 필요한 메소드 호출 메트릭 일 것입니다. 그렇지 않으면 거대한 처리 및 메모리 오버 헤드를 암시합니다. 입상 성의 문제도 있습니다. 필드 변경 사항 만 기록 하시겠습니까? 모든 메소드 호출? 메소드 호출 중 모든 CPU 명령어? JVM은 쉬운 방법을 취하고 위의 어느 것도 수행하지 않습니다.

해당 개체의 클래스 및/또는 특정 인스턴스를 격리해야하며 로그 자신이 필요로하는 모든 작업을 격리해야합니다. 아마도 수동으로해야 할 것입니다. 런타임에 로깅 코드를 삽입 할 수있는 바이트 코드 계측 라이브러리를 아직 찾지 못한 것입니다 ...

또는 계측 프로파일 러를 사용할 수도 있지만 그것을 할 때 거대한 성과 저하를 위해.

1

나는 일반적으로 @thkala와 @artbristol에 동의합니다 (둘 다 +1).

그러나 요구 사항이 있으며 선택의 여지가 없습니다. 솔루션이 필요합니다. 감사를 수행하는 동적 프록시, 즉 객체에 발생한 모든 변경 사항을 작성하여 객체를 래핑하려고하는 것이 좋습니다.

아마 이것을 위해 AspectJ를 사용할 수 있습니다. aspect는 호출 된 메소드와 전송 된 매개 변수가 무엇인지를 나타냅니다. 다른 낮은 수준의 도구를 사용할 수도 있습니다 (예 : Javasist 또는 CgLib.

+0

바이트 코드 생성 라이브러리에는 로깅 코드를 삽입하기위한 많은 노력이 필요합니다. 일반적으로 문제의 클래스 소스 코드에 수동으로 로깅 문을 추가하는 것이 더 쉽습니다. 그래도 문제는 있지만 AOP 제안을 +1 할 것입니다. 기존의 코드베이스에 AspectJ를 통합하면 ... – thkala

+0

@thkala,이게 장황하다.하지만 저수준 API를 사용하는 경우에만 가능하다. 나는 Javassist와 함께 일했다. 동적 프록시 (JDK의 프록시와 완전히 같지만 인터페이스 만이 아닌 클래스를 래핑 할 수 있음)를 작성할 수 있습니다. 정규 표현식을 사용하여 코드를 작성하는 것만 큼 쉽습니다.AspectJ는 이것을 단순화하는 또 다른 단계입니다. – AlexR

0

답변은 No입니다 .JVM은 개체 상태의 기록을 유지 관리하지 않습니다. 최대 값은 in-memory 일 수있는 개체 상태를 추적 할 수 있으며 예외가 발생하면 해당 인시던트를 직렬화 할 수 있습니다. 기억 개체 그리고 나는 당신이 분석을 할 수 있다고 생각합니다.