JNI_ENOMEM от JNI_CreateJavaVM при вызове dll, который использует JNI от VB6

Я работаю над унаследованной системой, которая имеет приложение VB6, которое должно назвать код Java. Решение, которое мы используем, состоит в том, чтобы иметь вызов приложения VB C++ dll, который использует JNI для вызова кода Java. Немного броский, но это на самом деле работало вполне прилично. Однако я перемещаюсь в новое dev поле, и я только что столкнулся с серьезной проблемой с этим. Созданное приложение VB хорошо работает на новом поле, но когда я пытаюсь выполнить его от VB, dll не удается загрузить VM, получая код возврата-4 (JNI_ENOMEM) от JNI_CreateJavaVM.

И созданное приложение и VB называют тот же самый dll, и я попробовал его и Java 1.5 и 1.6. Я попробовал предложения здесь (перенаправляющий stdout и stderr в файлы, добавив vfprint опцию, добавив-Xcheck:jni опцию), но напрасно. Я, может казаться, не вытаскиваю дополнительной информации из jvm. Насколько я могу сказать, новое поле настроено в значительной степени то же как старое (установленное программное обеспечение, Путь, Путь к классу, и т.д.), и оба выполняют тот же выпуск Windows Server 2003. Новая машина является x64 полем с большей памятью (4 ГБ, а не 2 ГБ), но это запускает 32-разрядный Windows.

Какие-либо предложения или идеи о том, что еще изучить? Перезапись всего этого более нормальным способом не является опцией - я должен найти, что способ иметь dll заставляет jvm загружаться, не думая, что это вне памяти. Любая справка очень ценилась бы.

1
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

Хорошо, я разобрался. Как указывает kschneid, JVM требуется довольно большой непрерывный кусок памяти внутри пространства памяти приложения. Поэтому я использовал утилиту sysinternals VMMap, чтобы посмотреть, как выглядит память VB. Фактически не было доступного большого количества доступной памяти, и были некоторые библиотеки, принадлежащие Visio, которые были загружены в места, которые, казалось, были предназначены для фрагментации памяти. Оказывается, когда я установил Visio на новый компьютер, он автоматически установил надстройку Visio UML в VB. Поскольку я не использую эту надстройку, я отключил ее. При отключенной надстройке был доступен большой непрерывный кусок свободной памяти, и теперь JVM загружается нормально.

1
ответ дан 2 September 2019 в 22:28
поделиться

У меня была та же проблема, описанная "the klaus" и прочитанная "http://support.microsoft.com/kb/126962". Изменил реестр, как описано в упомянутой статье. Я преувеличил свои изменения до : "%SystemRoot%\system32\csrss. exe ObjectDirectory=\Windows SharedSection=3072,3072,3072 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"

Поле, на которое нужно обратить внимание - "SharedSection=3072,3072,3072". Это решило мою проблему, но у меня могут быть побочные эффекты из-за этого изменения.

0
ответ дан 2 September 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: