簡體   English   中英

如何讓用戶輕松選擇在Java Swing應用程序中分配多少內存?

[英]How do I allow the user to easily choose how much memory to allocate in a Java Swing app?

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

我見過一個例子,其中一個應用程序指定了三個不同的快捷方式,每個快捷方式都指定了不同的內存量。 這可行,但我想要一個更靈活的選項。 然后,用戶可以選擇最適合他們的那個。

我建議使用與IntelliJ類似的東西。 當發生OutOfMemoryException時,它會彈出一個配置對話框。 此對話框允許用戶配置堆大小並將其存儲到idea.exe.vmoptions 您需要將文件的內容轉儲到java / javaw啟動命令中,或者使用一個Java程序引導程序並啟動實際程序。

一個非常酷的變體是根據數據大小建議內存大小。 用戶實際上無法知道程序需要多少內存,因此在選擇值時可以提供的任何指導都將極大地幫助他們。

支持此解決方案非常重要,您希望並以避免數據損壞的方式處理OutOfMemoryExceptions!

我會寫一個簡短的startup.jar,從腳本開始只有很少的固定內存設置。 反過來startup.jar將使用Runtime.exec()和調整后的參數啟動目標應用程序。

您最終會在2個JVM實例中占用更多內存,而不僅僅是一個JVM。 但是如果你的應用程序無論如何都要花費大量內存,那么第一個JVM並不重要。

主要想法是這樣的:

  • 通過類似於此的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應用程序中,有一個菜單選項Memory settings .... 當用戶選擇它時,解析用戶的配置文件並填充設置對話框,以便用戶可以更改適當的任何內容。 當用戶單擊“ 應用”或“ 確定”時 ,根據用戶選擇的settigns(在您的情況下為-Xmx )使用命令行選項覆蓋用戶配置文件,並顯示類似重新啟動應用程序以應用這些設置的消息

捕獲outofmemory excpetion,lauch用戶對話框來設置內存限制,將此值傳遞給使用Runtime.exec的線程()使用java -cp lib的jar vmoptions重新啟動應用程序將啟動指定內存大小的新jvm user.sample:

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

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

至於您當前的要求,只需向安裝程序添加一個頁面,然后根據所選的選項將正確的系統屬性文件復制到可用於啟動程序的用戶設置文件夾中。 我不確定它是否可行,但我認為一旦安裝了程序,用戶就可以重新運行安裝程序並選擇其他選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM