문제

java version "1.5.0_14"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)
Java HotSpot(TM) Server VM (build 1.5.0_14-b03, mixed mode)

정적으로 정의 된 필드에 대한 참조를 전달하기 위해 얻는 NullPointerException을 디버깅하려고합니다. 보다 구체적으로, 나는 Drools3 작업 메모리 인스턴스에서 글로벌을 설정하고 있습니다.

workingMemory.setGlobal("log", workingMemorieslog);

내 가정은 현장이 정적으로 정의 된 수업이 쓰레기를 수집하고 있다고 가정합니다. (수신 클래스는 약점이나 그와 비슷한 것을 사용해야합니다.

이것을 어떻게 디버그 할 것을 제안 하시겠습니까? JVM의 GC가 클래스의 클래스 / 인스턴스를 언로드하는시기를 정확히 알 수 있다면 버기 행동의 원인을 좁힐 수 있다고 생각합니다. (이벤트의 정확한 시간이 아니라면 적어도 어떤 일이 일어났다는 징후를 얻는다).

감사합니다, Maxim.

도움이 되었습니까?

해결책

GC 활동을 추적하려면 이것을 Java 명령에 추가합니다.

-verbose : gc -xx :+printgctimestamps -xx :+printgcdetails

당신이 얻는 NPE는 아마도 당신이 널 가치를 전달하는 것입니다.

다른 팁

수업을 메모리에 유지하지 않겠습니까? 그렇다면 여전히 발생하는지 확인하십시오. 그렇다면 문제가 다른 곳에 있습니다. 그렇지 않다면 문제가 쓰레기 수집에 있다는 것을 알고 있습니다.

Eclipse가 여기서 주요 문제라는 것이 밝혀졌습니다.

설명하겠습니다 :

성능을 테스트하기 위해 WebApp을 Main () 메소드로 래핑했습니다. 우리는 많은 타사 코드, 즉 Apache Commons-Pool을 사용합니다.

우리는 프로젝트에 몇 가지 버전의 항아리가 퍼져있는 것으로 나타났습니다 (Eclipse Projects). 이 프로젝트를 사용하는 내 앱에는 Commons-Pool-1.3이 있었으며 다른 프로젝트에는 Commons-Pool-1.2가있었습니다.

Servlet Container (TOMCAT6)를 사용하여로드 할 때 WebApp 클래스 로더가 우선 순위가 우선적이므로 항상 WebApp 버전을로드했습니다. Main () Eclipse를 사용하여 응용 프로그램을 시작했을 때 현명한 행동이 현명하지 않아 현재 프로젝트의 프로젝트 앞에 -ClassPath에서 의다 프로젝트 항아리를 내보냈습니다.

충돌은 2 가지 버전의 Commons -Pool 사이에서 정의되지 않은 동작을 일으켰습니다. 대상에서 차용이 새로운 객체를 만들기로 결정됩니다. 구현 코드를 살펴 보지 않았습니다. 이것이 GenerickeyEdoBjectPool (문제가있는 클래스)의 정적 맵 보유와 관련이 있다고 가정합니다. 새 인스턴스가 생성되었으므로 실제로 언급 된 글로벌에 대한 Null 참조가 포함되어 있습니다.

운에 대한 솔루션은 다소 간단했고 Commons-Pool은 내 WebApp에서만 사용되므로 참조 된 모든 프로젝트에서 삭제할 수 있습니다. 그렇지 않으면 단일 버전으로 업그레이드하려고 노력할 것입니다. 내가 할 수 없다면 내가 무엇을할지 정말로 모른다. 이것은 매우 이상한 일식 기본입니다.

읽고 도와 주셔서 감사합니다.

// ps. 3 일. 그것은 내가 서블릿 교체 코드에서 내가 무엇을 잘못했는지 이해하는 데 소비하는 시간입니다. 나는 문제조차 없다는 것이 밝혀졌다. :피

스택 추적이 있습니까?

무슨 일이 일어나고 있는지 확인하기 위해 'SetGlobal'메소드 (코드가 있다고 가정)에 들어 봤습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top