Проблемы с Matlab javabuilder и памятью - PullRequest
1 голос
/ 02 января 2009

У меня возникают некоторые проблемы, связанные с моим скомпилированным javabuilder-кодом. Мое приложение в основном разделено так:

  • GUI: Java
  • Расчеты: Matlab

Основная проблема заключается в том, что при компиляции моего кода matlab с помощью javabuilder в Matlab (R17, 2007a) у меня меньше доступной памяти, чем при компиляции того же кода в exe-файл. Я подтвердил это с помощью функции "feature ('memstats')". Мои массивы обычно имеют размер порядка 1000000 x 25, и это не инициализируется при запуске из Java, так как самое большое непрерывное пространство памяти слишком мало (самое большое - около 65 МБ, а не около 1200 МБ при запуске в качестве ML exe- файл). Моя установка работает под управлением Windows XP Professional x86 и имеет 4 ГБ памяти.

Я пробовал эти два компилятора matlab / c (настраиваются с помощью команды "mbuild -setup" в командной строке matlab):

  • Lcc-win32 C 2.4.1
  • Microsoft Visual C ++ 6.0 (также с флагом / LARGEADDRESSAWARE, который, похоже, совсем не помогает)

Есть предложения?

Ответы [ 3 ]

1 голос
/ 11 августа 2009

На самом деле, вы можете уменьшить пространство кучи Java. Память в вашем процессе, по крайней мере в обычном Matlab, разделена между Matlab и Java. Если вы увеличите размер кучи Java, вы соответственно уменьшите объем памяти, доступной для массивов Matlab. Массивы Matlab живут в обычной памяти в стиле C, а не в памяти Java GCed.

Я предполагаю, что ваше Java-приложение, в которое загружается библиотека, встроенная в javabuilder, настроено так, чтобы иметь большую кучу Java, чем Matlab IDE. Matlab начинается с небольшой кучи Java. Вот как это отобразить из Matlab.

function show_javamemory()

rt = java.lang.Runtime.getRuntime();
M = 2^20;
disp(sprintf('Java heap: %d M total, %d M max, %d M free',...
    round(rt.totalMemory()/M), round(rt.maxMemory()/M), round(rt.freeMemory()/M)));

В моем R2009a я вижу это.

>> show_javamemory()
Java heap: 62 M total, 125 M max, 28 M free

Этот файл java.opts в% matlabroot% / bin / win32 контролирует JVM, встроенную в Matlab, когда он запускается как IDE. Я не думаю, что это повлияет на приложения, которые загружаются в вашей библиотеке, собранной javabuilder. Они должны быть скорректированы путем передачи параметров в любую вызывающую их командную строку Java.

Попробуйте запустить show_javamemory () из вашего скомпилированного приложения, чтобы увидеть, как настроена его куча (и повлияло ли изменение java.opts), а затем настроить ее параметры Java для уменьшения кучи.

0 голосов
/ 02 января 2009

Извините, я не могу оставлять комментарии (нужно 50 репутации) (и это слишком долго для комментария в любом случае). Я не думаю, что это что-то изменило. Я создал «java.opts» в% matlabroot% \ bin \ win32 и установил для содержимого «-Xmx1024m». Затем я попытался перекомпилировать свое приложение.

Это то, что функция ('memstats') говорит в начале моей функции matlab:

Physical Memory (RAM):
    In Use:                             1568 MB (62059000)
    Free:                               2013 MB (7ddb2000)
    Total:                              3582 MB (dfe0b000)
Page File (Swap space):
    In Use:                             1608 MB (648ac000)
    Free:                               3872 MB (f20b1000)
    Total:                              5481 MB (15695d000)
Virtual Memory (Address Space):
    In Use:                             1611 MB (64b4c000)
    Free:                               1460 MB (5b494000)
    Total:                              3071 MB (bffe0000)
Largest Contiguous Free Blocks:
     1. [at 69b78000]                     53 MB ( 3538000)
     2. [at  ccbf000]                     51 MB ( 3341000)
     3. [at 6eee0000]                     40 MB ( 2820000)
     4. [at 5d36e000]                     28 MB ( 1cd2000)
     5. [at 67d15000]                     23 MB ( 17eb000)
     6. [at 5f211000]                     19 MB ( 13bf000)
     7. [at 6dac0000]                     19 MB ( 13a0000)
     8. [at 71ce7000]                     19 MB ( 1319000)
     9. [at 7a038000]                     18 MB ( 12f8000)
    10. [at 7d1d7000]                     18 MB ( 1239000)
                                        ======= ==========
                                         292 MB (124ff000)
0 голосов
/ 02 января 2009

Я думаю, что решение вашей проблемы состоит в увеличении пространства кучи Java VM, как описано здесь:

Как увеличить пространство кучи для Java VM в MATLAB 6.0 (R12) и более поздних версиях?

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