2013-12-24 2 views
0

Я читаю статью здесь: http://www.kdgregory.com/?page=java.byteBufferНедостаток вызова JNI?

На этой странице, есть в этом разделе:

На самом деле, единственная причина, по которой я могу видеть, для использования прямых буферов в чистом Java программы является то, что они не будут перемещаться во время сбора мусора. Если вы прочитали мою статью о ссылочных объектах, вы помните, что сборщик мусора сжимает кучу после утилизации мертвых объектов. Если у вас есть большие блоки памяти кучи, выделенные в виде буферов, они могут перемещаться как часть уплотнения и независимо от того, насколько быстро ваш процессор занимает время; это не то, что вы хотите делать в каждой полной коллекции. Поскольку прямой буфер живет вне кучи, на него не влияют коллекции. С другой стороны, каждый доступ к данным является вызовом JNI. Только бенчмаркинг скажет вам, помогает ли это или вредит вашему конкретному приложению.

Утверждение JNI подразумевает наличие недостатка в использовании JNI, но я не уверен, что это такое. Может ли кто-нибудь помочь? Я нашел этот вопрос при переполнении стека: Disadvantages of using Java Native Interface

Однако я не поверил из контекста утверждения в этом параграфе, автор подразумевал, что недостатком было то, что JNI было трудно отлаживать или что оно могло бы JVM. Благодаря!

+0

Этот вид кажется попрошайничеством вопрос. Учитывая, насколько смехотворно низкий уровень JNI, я бы сомневался, что накладные расходы настолько значительны. То есть вы не сортируете сложные типы или что-то еще. – millimoose

+1

Это говорит: [Что заставляет JNI звонить медленнее?] (Http://stackoverflow.com/questions/7699020/what-makes-jni-calls-slow) – millimoose

+1

К. Д. Грегори не понимает, для чего нужны прямые буферы. Они предназначены для использования при копировании между каналами, когда вам вообще не нужны данные в коде Java. Они * сохраняют операции в стиле JNI, не перемещая данные между стороной JNI и стороной JVM. Если вы манипулируете данными на Java, они, конечно, бессмысленны и дороги. – EJP

ответ

0

JNI зависит от вашего приложения. Когда-нибудь вы будете использовать библиотеку c третьей части. Ant библиотека может быть не полностью протестирована. Он будет содержать ошибки утечки памяти или неправильного доступа к памяти. Там две проблемы - это большие проблемы JNI. Это приведет к сбою вашего приложения.

вы можете написать простую библиотеку с, как:

int * a = NULL; 
*a = 20; 

и вызова кода в JAVA. Приложение JAVA будет отключено без вывода JVM, и вы не сможете поймать никаких исключений в JAVA.

+1

Прочтите вопрос, а не только заголовок. –

Смежные вопросы