2009-01-02 24 views
1

我遇到了一些關於我的javabuilder編譯的matlab代碼的問題。我的應用程序基本上是分裂這樣的:Matlab javabuilder和內存的問題

  • GUI:Java的
  • 計算:Matlab的

的主要問題是,編譯與在Matlab(R17,2007年的javabuilder我MATLAB代碼時),與我將相同的代碼編譯到exe文件時相比,我擁有的內存更少。我用「功能('memstats')」功能證實了這一點。我的數組通常大小順序爲1000000 x 25,並且在從java運行時無法初始化,因爲最大的連續內存空間太小(最大的大小約爲65MB,而作爲ML EXE運行時大小約爲1200MB)文件)。我的鑽機正在運行Windows XP Professional x86並具有4GB的內存。

我已經試過這兩個MATLAB/C-compilators(設置與在MATLAB命令行中的 「mbuild -setup」 命令):

  • LCC-將Win32 C 2.4.1
  • 微軟Visual C++ 6.0(也用/ LARGEADDRESSAWARE標誌,這似乎根本沒有幫助)

有什麼建議嗎?

回答

0

我很抱歉,我不能發表評論(50需要聲望)(這無論如何評論太長)。我不認爲這會改變任何事情。我所做的是在%matlabroot%\ bin \ win32中創建「java.opts」,並將內容設置爲「-Xmx1024m」。然後我嘗試重新編譯我的應用程序。

這是我的MATLAB的功能開始什麼功能(「memstats」)說:

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) 
1

其實,你可能想下降 Java堆空間。在你的過程中,至少在常規的Matlab中,內存被分成Matlab和Java。如果增加Java堆大小,則會相應地減少可用於Matlab陣列的內存。 Matlab數組存在常規的C風格內存中,而不是Java的GCed內存。

我猜測發生了什麼事情是,您的Java應用程序(它正在加載javabuilder構建的庫)配置爲具有比Matlab IDE更大的Java堆。 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 

,在%matlabroot%/斌/ win32的java.opts文件控制內容內嵌在Matlab的JVM,當它運行作爲一個IDE。我不認爲這會影響在您的javabuilder構建的庫中加載的應用程序。他們需要通過傳遞參數給任何java命令行調用它們來進行調整。

嘗試從已編譯的應用程序中運行show_javamemory()以查看其堆配置爲什麼(以及您的java.opts更改是否有效),然後調整其Java選項以減少堆。