我有一個使用2400x1800緩衝圖像(我知道需要大量資源)的應用程序,但它的工作時間超過90%。需要130 MB的RAM並使用5%的CPU。Java應用程序佔用了10%的時間
問題是,有10%的時間,它有一個很大的滯後,只消耗40到50 MB RAM,並使用50%的CPU。爲什麼它沒有吃相同的記憶?
我知道我應該發佈一些代碼,但應用程序真的很大,鏈接到可能會談論這個特定問題的東西會有很大的幫助。
我有一個使用2400x1800緩衝圖像(我知道需要大量資源)的應用程序,但它的工作時間超過90%。需要130 MB的RAM並使用5%的CPU。Java應用程序佔用了10%的時間
問題是,有10%的時間,它有一個很大的滯後,只消耗40到50 MB RAM,並使用50%的CPU。爲什麼它沒有吃相同的記憶?
我知道我應該發佈一些代碼,但應用程序真的很大,鏈接到可能會談論這個特定問題的東西會有很大的幫助。
或許運行JVM參數,如XMX(這是最大尺寸avaliable的應用程序中使用)和跨站腳本(這是該應用程序的起始內存)可以幫助你。
試試這個在Eclipse(假設你使用它)
去RUN菜單,
然後運行配置...
然後選擇你的亞軍。
並單擊(x)=參數選項卡。
添加到您的VM參數
-Xmx512m -Xss150m
嘗試運行它......這會讓你的JVM開始至少已經分配給它的可用RAM 150MB ...
如果不使用eclipse,只需將這些參數添加到您的java命令行。
我使用Netbeans,但非常有幫助的迴應。謝謝 – 2011-05-02 14:51:46
希望它解決了它! – 2011-07-21 13:50:31
通過分析器運行它。 JProfiler是一個很好的使用。
您是否正在一次性加載圖片?爲什麼不將它平鋪並製作一些加載圖像的線程?如果你的程序中加載View的部分太大了,爲什麼不把它散佈在線程中呢?需要更多的建議?
好運
不,謝謝你的幫助 – 2011-05-02 14:50:29
首先,130MB是很多,即使是2400x1800的圖像,這是不是意味着你消耗每像素27Byte。
對於每個像素(或4字節)圖像的經典32位,你會從你說的話只需要16-17MB
其次,它似乎是你消耗更多的內存,直到垃圾收集器被稱爲並且爲釋放內存做了很多工作。
您可能需要: - 增加可用的最大內存。 - 調整垃圾回收器來縮短暫停時間,但更頻繁。
編輯:也許你創造了很多這種大小的新形象,而不是更新它們,迫使大量的內存分配和內存的解除分配?
應用程序是一個很大的,..感謝您的迴應 – 2011-05-02 14:44:48
這個問題幾乎沒有問題,但是應用程序中的週期性放緩通常是由於garbage collection。運行jvisualvm並查看與內存有關的圖表。如果您看到鋸齒圖案的峯值與性能下降的開始相吻合,則由於垃圾收集器處理大量對象,這會導致您的應用程序變慢。這可能會造成代碼中浪費的對象創建,或者您可能只需要爲虛擬機分配更多的內存。
這裏是一個指導
運行探查器(甚至是採樣器)時,它表現不佳,並檢查它始終運行的代碼。這應該讓你開始。 – 2011-05-02 13:43:20
您是否檢查過垃圾收集器是否在「壞」時運行這些時間?我敢打賭就是這樣。 – Borealid 2011-05-02 13:43:54