簡體   English   中英

動態設置Java進程的最大堆大小

[英]Dynamically setting maximum heap size for java process

我有一個批處理文件啟動的Java程序,其行如下所示:

javaw -Xms64m -Xmx1024m com.acme.MyProgram

但是,在某些計算機上,該程序將無法啟動,並顯示以下消息:

無法為對象堆保留足夠的空間。 無法創建Java虛擬機。

問題似乎是內存分配池的最大大小大於計算機可以處理的大小。 將內存分配池的最大大小從1024m減少到512m似乎可以解決此問題。

有沒有一種方法可以確定計算機上有多少可用的內存(從批處理文件中)並確定在批處理文件調用中使用-Xmx1024m還是-Xmx512m 請注意,此批處理文件僅需要在Windows上運行。

實際上,Java VM已經做了類似的事情。 如果未指定-Xms-Xmx ,那么將從計算機上的物理內存量中推斷出這些值。 或者至少說,這樣這個頁面

您可以將-Xms設置為使應用程序有用的最小堆大小,並讓Java為-Xmx確定合適的值。

您可以在此頁面上查看一些答案: 讓JVM根據需要增加內存需求,直至達到VM限制的大小?

如果您的程序以最大512m的最大容量正確運行,我將使用該值。

也就是說,我還將檢查是否有一種方法可以解決您的要求,因為這是一個有趣的問題。

您可以從批處理文件執行,檢查退出時的錯誤級別,如果失敗則從較低的內存重新啟動。 我不確定錯誤級別是否會起作用-如果不是,您還可以檢查該程序執行了多長時間...少於10秒的任何事情都是免費的。

不過只有幾個評論-

如果您知道它不需要超過512,則應運行測試以確保1024確實有幫助。 較大的堆通常會使您的GC暫停時間更長,而無濟於事。

如果您確定要使用一定數量的內存(例如,堆將輕松填充正在分配的512),則應將最小值設置為該數量。 如果您的程序分配了一堆東西,但不是根據情況(總是使用大約相同數量的內存),則將min和max都設置為512很好。

暫無
暫無

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

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