Мониторинг использования памяти для C DLL, вызванной с Java через JNI? - PullRequest
5 голосов
/ 09 октября 2008

Как я могу отслеживать использование памяти родной C-библиотекой C, которая вызывается из Java через JNI? Используя стандартные инструменты и параметры мониторинга Java, я могу видеть пространство памяти Java, но я не могу просмотреть какую-либо память, используемую C DLL. Java использует ~ 70 МБ, но задача в Диспетчере задач показывает 200 МБ +, и я хотел бы посмотреть, что в этих 130 МБ дополнительно, если возможно.

Ответы [ 4 ]

3 голосов
/ 09 октября 2008

Вы можете отслеживать собственную кучу с помощью счетчиков в мониторе производительности. (perfmon32), однако он не будет разбивать его для вас отдельно для каждой DLL, даже jvm.dll будет включен сюда.

Большинство инструментов для профилирования могут подключаться к процессу, а также регистрировать и отслеживать распределение и освобождение памяти. Это позволяет им спекулировать, где есть утечки. Один очень хороший пример, который я обнаружил, когда недавно пытался отследить утечки памяти в нативном коде, который вызывался из Java, это Memory Validator

1 голос
/ 09 октября 2008

Вы пытались использовать Process Viewer , чтобы копать глубже.

Если у вас есть исходный код для DLL, вы можете перестроить его с помощью библиотек отладки и, возможно, трекера выделения памяти - и отладить с помощью визуального отладчика C ++ (вам нужно указать это для использования java-приложения).

Если у вас нет источника - тогда возможности ограничены.

0 голосов
/ 09 октября 2008

Что ж, поскольку DLL на самом деле не является частью кучи Java, я думаю, что наиболее точным считыванием будет написать небольшую программу профилирования (небольшую программу на Java / JNI или C ++ / C # и т. Д.) Для импорта. и используйте DLL аналогично вашему приложению и НИЧЕГО НЕ ДЕЛАЙТЕ - просто используйте DLL, как и вы - результирующий профиль памяти этого приложения для профилирования должен быть хорошим приближением к профилю памяти DLL.

Вы также должны проверить, есть ли статическая или динамическая форма памяти DLL - измерять память непосредственно до и после загрузки DLL, чтобы увидеть, есть ли время обращения ~ 130 МБ, или если память медленно увеличивается со временем.

В Solaris / Linux я слышал, что Sun Studio Collector / Analyzer - хороший инструмент для этого, но вы застряли в DLL-земле (или как бы в адской DLL)

0 голосов
/ 09 октября 2008

Я полагаю, что даже сделать это внутри C DLL не будет очень легко.

Насколько я понимаю, стандартные средства мониторинга Java собирают информацию, запрашивая виртуальную машину, поэтому, хотя эта память находится в одном и том же процессе, если виртуальная машина не знает, как проверять вашу динамически связанную библиотеку, она не сможет чтобы увидеть что-нибудь. Я считаю, что вам нужно будет использовать внешний инструмент или сделать несколько масштабных изменений в DLL, чтобы отслеживать использование памяти.

...