[英]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.