Профиль памяти Классы/структуры Java JNI, созданные в C/C

#java #c #c #java-native-interface

Вопрос:

Мы используем Java 11 с загрузкой Spring и запускаем наше приложение в контейнере Docker в AWS ECS.
Наше приложение отвечает за обработку изображений, и наш код Java вызывает код C/C через JNI для некоторых манипуляций с изображениями.
Недавно, после того, как были введены некоторые изменения на стороне, мы видим контейнер из памяти вопросы (не в JVM ООМ).
Мой вопрос следующий -Есть ли какой-то инструмент, который VisualVM, где, как вы можете видеть, какие объекты есть на родной памяти (не кучи Java — который VisualVM это)
Это означало бы что-то вроде профилирования с jcmd ${process} VM.native_memory помощью , но вместо получения только приведенных ниже результатов этой операции, чтобы получить что-то более подробное, где вы можете увидеть, какие классы/структуры C/C находятся в памяти в это время? введите описание изображения здесь

с уважением

Комментарии:

1. Обычно нет. Читаемые человеком имена бесполезны для компьютера, поэтому они являются одними из первых, что нужно сделать. Отладочная сборка с правильными инструментами может предоставить дополнительную информацию. Если вы добавите, какую цепочку инструментов вы используете для создания кода на языках C и C , к вопросу, мы, возможно, сможем предоставить менее общую информацию.

2. Наше приложение отвечает за обработку изображений -это 32-разрядное приложение или 64-разрядное приложение? Если он 32-разрядный и изображения могут храниться в памяти, большие изображения или изображения с высоким уровнем разрядности могут легко исчерпать память.

3. Замените свой собственный распределитель памяти на jemalloc; это позволяет вам, по крайней мере, отслеживать распределение в стеке вызовов распределения.

4. Запустите все свое приложение (Java-код) через https://valgrind.org или gprof — вы можете взглянуть на пример здесь: youtu.be/0CAuWuMkKBM (Однако он ориентирован на профилирование на основе macOS)