2010-09-09 21 views
3

我們有一個Swing應用程序,可以處理大量的數據。例如,我們目前正在處理具有數百萬行數據的CSV文件。出於性能和簡單性的原因,我們只保留所有的數據在內存中。然而,不同的用戶需要處理不同數量的數據以及不同數量的RAM。在創建安裝程序時,我們當然需要指定堆大小。有沒有簡單的方法允許用戶指定堆而不需要手動編輯配置或.bat文件?我猜並非所有用戶都會對此感到滿意。如何讓用戶輕鬆選擇在Java Swing應用程序中分配多少內存?

我已經看到,其中一個應用程序中指定的每個三種不同的快捷方式與指定的不同量的存儲器的一個例子。這可以工作,但我想要一個更靈活的選項。然後用戶可以選擇最適合他們的那個。

回答

6

我建議有類似於IntelliJ的東西。當發生OutOfMemoryException時,它會彈出一個配置對話框。該對話框允許用戶配置堆大小並將其存儲到idea.exe.vmoptions。您需要將文件的內容分成java/javaw啓動命令或者有一個Java程序啓動並啓動真正的啓動程序。

這個

一個很酷的變化是提出基於數據大小的存儲器大小。用戶真的無法知道程序需要多少內存,因此您在選擇值時可以提供的任何指導將極大地幫助他們。

正是在支持這一解決方案,您預計和避免數據損壞的方式處理OutOfMemoryExceptions極爲重要!

0

你沒有提到你是如何創建安裝程序的。如果你還沒有使用它,我建議使用NSIS。文檔很好,它有一個用於eclipse的插件。您可以使用該向導來生成nsi文件,然後手動編輯該向導不可用的選項。

至於當前的需求,一個簡單的頁面添加到安裝程序的選項,並根據所選的選項,複製正確的系統屬性文件,你可以用它來啓動你的程序的用戶設置的文件夾。我不確定它是否可行,但我認爲一旦程序安裝完畢,用戶可以重新運行安裝程序並選擇其他選項。

+0

我們正在使用NSIS。這個解決方案的問題是堆的大小在安裝時是固定的。用戶應該能夠在以後更改堆大小時,他們將更多的內存添加到他們的計算機或必須處理比以前更大的文件。 – 2010-09-09 13:21:58

+0

只需要用戶重新運行安裝程序,並選擇其他選項,如果他們需要更大的堆大小。如果您想讓用戶更容易,請嘗試創建一個顯示對話窗口的小程序,以便選擇堆大小並將主程序作爲不同的進程啓動。有一個關於它的討論http://stackoverflow.com/questions/480433/launch-jvm-process-from-a-java-application-use-runtime-exec – 2010-09-10 09:53:31

1

我會寫從一個腳本啓動極少數的固定內存設置短startup.jar文件。反過來,startup.jar將使用Runtime.exec()和調整的參數啓動目標應用程序。

你在花的比只有一個JVM的內存2個JVM實例結束。但是如果你的應用程序會花費大量內存,那麼第一個JVM並不重要。

1

主要的想法是這樣的:

  • 通過類似於這樣的shell腳本啓動主應用程序:
 
@echo off 
setlocal 
REM This reads the JVM command line options from a user configuration file 
for /f %x in (%HOMEDRIVE%%HOMEPATH%\myapp.config) do set JVM_OPTIONS=%x 
REM Important: call javaw and not java 
javaw -jar myApp.jar %JVM_OPTIONS% 
endlocal 
  • 在Swing應用程序中,有一個菜單選項記憶設置...。當用戶選擇該選項時,解析用戶的配置文件並填充設置對話框,以便用戶可以更改其適用的任何內容。當用戶點擊應用確定,用命令行選項覆蓋用戶配置文件根據用戶選擇的settigns(在您的情況下,-Xmx),並顯示一條消息,如重新啓動應用程序以應用這些設置
+0

我喜歡在swing應用程序中使用菜單的想法。當您設置內存配置時,我們可以重新加載用戶定義的類加載器,我們已經加載了該應用程序。 – 2010-09-17 06:28:28

+1

重新加載類加載器是不夠的,我認爲您需要退出並重新啓動JVM才能使更改生效。 – gpeche 2010-09-17 07:07:23

1

抓了內存溢出錯誤時拋出,勞克擺動用戶對話框,設置內存限制,此值傳遞到使用的Runtime.exec線程()重新啓動使用java命令lib中的jar vmoptions將推出一個新的應用與指定user.sample內存大小JVM:

Runtime.getRuntime().exec("java -cp 
-Xms2560m -Xmx2560m -XX:NewSize=32M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewG launch.jar"); 
相關問題