Проблемы с объемом памяти в приложениях JAVA, JNI и C - PullRequest
2 голосов
/ 19 сентября 2008

У меня есть часть приложения, написанная на C, она порождает JVM и использует JNI для взаимодействия с Java-приложением. Мой объем памяти через Process Explorer достигает 1 ГБ и заканчивается памятью. Теперь, насколько я знаю, он должен быть в состоянии получить до 2 ГБ. Я верю в то, что память, которую использует JVM, не видна в Process Explorer. Мой xmx установлен на 256, я добавил несколько операторов, чтобы наблюдать за памятью на стороне java, и она достигает пика на уровне 256, а GC выполняет свою работу, и с этой стороны все хорошо. Итак, мой вопрос: где расходуются остальные 700+ МБ? Кто-нибудь есть эксперт по памяти Java / JNI / C?

Ответы [ 6 ]

1 голос
/ 20 сентября 2008

Попробуйте тестовое приложение на C, которое не порождает JVM, а вместо этого пытается выделить больше и больше памяти. Проверьте, может ли тестовое приложение достичь барьера в 2 ГБ.

1 голос
/ 19 сентября 2008

В коде JNI может быть утечка.

Не забудьте использовать (* jni) -> DeleteLocalRef () для любых ссылок на объекты, которые вы получите, когда закончите с ними. Если вы используете какие-либо собственные буферы C для создания новых объектов Java, убедитесь, что вы освободили их после создания объекта. Проверьте спецификацию JNI для получения дальнейших указаний.

В зависимости от используемой виртуальной машины вы можете включить проверку JNI. Например, в IBM JDK вы можете указать "-Xcheck: jni".

0 голосов
/ 20 сентября 2008

Что ж, благодаря всей вашей помощи, особенно @alexander, я обнаружил, что вся лишняя память, которая не видна через Process Explorer, используется Java Heap. Фактически через другие тесты, которые я запускал, потребление памяти JVM включено в то, что я вижу из Process Explorer. Таким образом, куча занимает много памяти, мне нужно будет еще кое-что изучить и, возможно, задать отдельный вопрос.

0 голосов
/ 19 сентября 2008

Если вы говорите, что процессу Windows не хватает памяти, а не JVM, то я предполагаю, что вы, вероятно, вызываете некоторые (свои) собственные методы из JVM, и эти собственные методы вызывают утечку памяти. Итак, я согласен с @Джоном Гарднером здесь.

0 голосов
/ 19 сентября 2008

Код C и JNI также может выделять память (malloc / free / new / etc), которая находится за пределами 256 м виртуальной машины. XMX ограничивает только то, что виртуальная машина выделяет сама. В зависимости от того, что вы выделяете в коде C, и какие другие вещи загружаются в память, вы можете или не сможете получить до 2 ГБ.

0 голосов
/ 19 сентября 2008

Напишите тестовый комплект C и используйте valgrind / alleyoop для проверки на утечку в вашем коде C, а также используйте инструмент java jvisualvm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...