문제

JNI를 통해 Java에서 호출되는 기본 C DLL에서 사용하는 메모리를 어떻게 모니터링 할 수 있습니까? 표준 Java 모니터링 도구 및 옵션을 사용하면 Java 메모리 공간을 볼 수 있지만 C DLL에서 사용하는 메모리를 볼 수는 없습니다. Java는 ~ 70MB를 사용하고 있지만 작업 관리자의 작업에는 200MB+가 표시되며 가능한 경우 130MB 추가의 내용을보고 싶습니다.

도움이 되었습니까?

해결책

성능 Montitor의 카운터로 기본 힙을 모니터링 할 수 있습니다. (perfmon32) 그러나 그것은 dll 기준으로 당신을 위해 그것을 분류하지 않으며, JVM.dll조차도 여기에 포함됩니다.

대부분의 프로파일 링 도구는 프로세스에 연결하고 메모리 할당 및 거래를 캡처하고 추적 할 수 있습니다. 이를 통해 누출이 어디에 있는지 추측 할 수 있습니다. 최근에 Java에서 호출 된 기본 코드에서 메모리 누출을 추적하려고 할 때 찾은 꽤 좋은 것 중 하나입니다. 메모리 유효성 검사기

다른 팁

사용해 보셨습니까? 프로세스 뷰어 더 깊이 파는 것.

DLL의 소스가있는 경우 디버그 라이브러리와 멤버로 재구성 할 수 있으며 Visual C ++ 디버거를 사용하여 디버그 할 수 있습니다 (Java 응용 프로그램을 사용하려면 알려야합니다).

소스가 없으면 옵션이 제한됩니다.

나는 c dll 내부에서 이것을하는 것이 쉽지 않을 것이라고 믿는다.

표준 Java 모니터링 도구를 이해하는 한 가상 머신을 쿼리하여 정보를 수집하므로 가상 머신이 동적으로 연결된 라이브러리를 검사하는 방법을 모르는 한 메모리가 동일한 프로세스에 있더라도 아무것도 볼 수 없습니다. . 메모리 사용량을 추적하기 위해 외부 도구를 사용하거나 DLL을 다소 수정해야한다고 생각합니다.

글쎄, DLL은 실제로 Java 힙의 일부가 아니기 때문에 가장 정확한 독서는 작은 프로파일 링 프로그램 (작은 java/jni 프로그램 또는 C ++/C#등)을 작성하여 DLL은 응용 프로그램과 비슷한 방식으로 다른 방법으로 수행하지 않고 DLL을 사용하십시오.

또한 테스트해야합니다. 공전 또는 동적 DLL의 메모리 모양 - DLL이 ~ 130MB의 일회성 히트가 있는지 또는 시간이 지남에 따라 메모리가 천천히 증가하는지 확인하기 위해 DLL 직전 및 직후에 메모리 측정을 수행합니다.

Solaris / Linux에서는 Sun Studio Collector / Analyzer가 이것에 대한 좋은 도구라고 들었지만 DLL-Land (또는 DLL Hell)에 갇혀 있습니다.

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