Java question

Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Java question

Post by Don Cherry »

Вопрос про max heap size in Java7 32.
Command line run vs JNI.

#1. command line
Если использую option -Xmx
java -classpath "." -Xms300m -Xmx1000m myprogram
работает согласно Java документации
max: 966
total: 290
free: 288
used [total - free]: 1


#2 JNI
Если использую option -Xmx в JNI

m_options[0].optionString = "myclasspath...";
m_options[1].optionString = "-Xms300m";
m_options[2].optionString = "-Xmx1000m";
m_vmargs.options = m_options;
m_vmargs.nOptions = 3;
rc = JNI_CreateJavaVM(&m_pJavaVM, (void**)&m_pJNIEnv, &m_vmargs);

rc is JNI_ENOMEM -4 и JVM не стартует.

***
#define JNI_OK 0 /* success */
#define JNI_ERR (-1) /* unknown error */
#define JNI_EDETACHED (-2) /* thread detached from the VM */
#define JNI_EVERSION (-3) /* JNI version error */
#define JNI_ENOMEM (-4) /* not enough memory */
#define JNI_EEXIST (-5) /* VM already created */
#define JNI_EINVAL (-6) /* invalid arguments */
***

Не могу понять, почему JNI не работает также как run in command line.
2GB is available.
OS tried on: Windows XP, Windows 10, Windows Server 12
In my case, JNI wants max heap 250MB, меньше работает, если я задаю больше - error code -4.
Of course not... , but it looks like for Java7 32 JNI the 250MB max heap size is hardcoded in JVM, no?
Кто-нибудь может подсказать?
Спасибо.


public class myprogram
{
public static void main(String[]args)
{
System.out.println("max: " + Runtime.getRuntime().maxMemory() / 1024 / 1024);
System.out.println("total: " + Runtime.getRuntime().totalMemory() / 1024 / 1024);
System.out.println("free: " + Runtime.getRuntime().freeMemory() / 1024 / 1024);
System.out.println("used [total - free]: " + (Runtime.getRuntime().totalMemory()- Runtime.getRuntime().freeMemory()) / 1024 / 1024);
}
}
Don Cherry
Уже с Приветом
Posts: 166
Joined: 13 Oct 2003 20:11
Location: Canada

Re: Java question

Post by Don Cherry »

Убираю свой вопрос, C++ программа с "min code" работает правильно.
Похоже что моя другая C++ программа как-то делает memory fragmentation и JNI_CreateJavaVM не может найти целый кусок RAM в 1MB.
Хотя TaskManager показывает 2MB is available.
С такими Windows memory fragmentation затыками можно вообще забыть о чём проект и что программируешь, перестать видеть лес [и деньги] за деревьями, а жизнь коротка.


C++ программа с "min code"

#include "stdafx.h"
#include <jni.h>

int _tmain(int argc, _TCHAR* argv[])
{
jint rc;
JavaVM* m_pJavaVM;
JNIEnv* m_pJNIEnv;
JavaVMInitArgs m_vmargs;
JavaVMOption m_options[3];

m_options[0].optionString = "-Djava.class.path=.";
m_options[1].optionString = "-Xms300m";
m_options[2].optionString = "-Xmx1000m";

m_vmargs.version = JNI_VERSION_1_6;
m_vmargs.options = m_options;
m_vmargs.nOptions = 3;
//m_vmargs.ignoreUnrecognized = JNI_TRUE;
m_vmargs.ignoreUnrecognized = JNI_FALSE;

rc = JNI_CreateJavaVM(&m_pJavaVM, (void**)&m_pJNIEnv, &m_vmargs);
rc = m_pJavaVM->DestroyJavaVM();

return 0;
}

Return to “Вопросы и новости IT”