2008-10-08 2 views
4

JNI를 통해 Java에서 호출되는 네이티브 C DLL에서 사용중인 메모리를 어떻게 모니터합니까? 표준 Java 모니터링 도구 및 옵션을 사용하여 Java 메모리 공간을 볼 수는 있지만 C DLL에서 사용하는 메모리를 볼 수는 없습니다. 자바는 ~ 70MB를 사용하고 있지만 작업 관리자의 작업은 200Mb +를 보여 주며 가능한 경우 해당 130MB의 여분을보고 싶습니다.JNI를 통해 Java로 호출되는 C DLL의 메모리 사용을 모니터링 하시겠습니까?

답변

3

당신 솔라리스/리눅스에

, 나는 썬 스튜디오 수집/분석이를위한 좋은 도구입니다 들었습니다,하지만 당신은 DLL-땅에 붙어있어 성능 모니터의 카운터로 원시 힙을 모니터링 할 수 있습니다. (perfmon32) 그러나 그것은 DLL 기반으로 당신을 위해 그것을 해치지 않을 것이고 jvm.dll조차 여기에 포함될 것입니다.

대부분의 프로파일 링 도구는 프로세스에 연결하여 메모리 할당 및 할당 해제를 캡처하고 추적 할 수 있습니다. 이를 통해 누출 위치를 추측 할 수 있습니다. Java에서 호출 된 네이티브 코드에서 메모리 누수를 추적하려고 할 때 꽤 좋은 점이 하나 있습니다. Memory Validator

+0

힌트를 보내 주셔서 감사합니다, 데 클랜, 월요일에 이걸 시험해 보겠습니다. – lawsonj2019

+1

Java에서 호출 된 JNI DLL의 메모리 사용 모니터링 http://www.softwareverify.com/software-verify-blog/?p=221 –

1

Process Viewer을 더 깊이 파고 들으셨습니까?

DLL에 대한 소스가있는 경우 디버그 라이브러리 및 가능하면 메모리 할당 추적기로 다시 빌드 할 수 있으며 Visual C++ 디버거를 사용하여 디버깅 할 수 있습니다 (Java 응용 프로그램을 사용하려면이 DLL을 알려야합니다).

소스가없는 경우 옵션이 제한됩니다.

+0

이 정보는 리차드에게 더 많은 정보를 제공하지만 누출 위치를 결정할만큼 충분하지는 않습니다. Process Viewer는 Windows 기반 개발자를위한 툴킷에 포함 된 훌륭한 도구입니다. – lawsonj2019

+0

소스가 있으면 VS에서 다시 빌드하고 디버그 할 수 있습니다 ... (대답 확장 참조) –

-1

나는 C DLL 내부에서도 이렇게하는 것이 쉽지 않을 것이라고 믿는다.

표준 Java 모니터링 도구는 가상 시스템을 쿼리하여 정보를 수집하므로, 동적으로 링크 된 라이브러리를 검사하는 방법을 가상 시스템이 아는 경우가 아니면 동일한 프로세스에 있습니다. 무엇이든 볼 수 있습니다. 외부 도구를 사용하거나 메모리 사용을 추적하기 위해 DLL을 다소 수정해야한다고 생각합니다.

+0

Java 모니터링 도구는 Java 힙에 대한 정보 만 제공하며, Java 힙에 대한 정보는 제공하지 않으며 Windows에서 기본 호출을 처리합니다. – lawsonj2019

-1

DLL은 실제로 Java 힙에 포함되어 있지 않으므로, 작은 프로파일 링 프로그램 (작은 Java/JNI 프로그램 또는 C++/C# 등)을 작성하는 것이 가장 정확하다고 생각합니다. 가져 오기 및 응용 프로그램과 비슷한 방식으로 DLL을 사용하고 아무 것도하지 - 그냥 DLL을 사용하여 -이 프로파일 링 애플 리케이션의 결과 메모리 프로파일은 DLL의 메모리 프로파일에 대한 좋은 근사해야합니다.

당신은 또한 DLL의 정적 또는 동적 메모리 형태가 있는지 테스트해야합니다 - 직접 이전과 DLL이 ~ 1백30메가바이트의 일회성 히트가 있는지로드 된 후 메모리 성과 지표를 가지고, 또는 메모리가 시간이 지남에 천천히 올라간다면. (말하자면, 또는 DLL 지옥)

관련 문제