2017-06-04 59 views
1

程序範例:靜態變量,libgdx和android暫停/恢復內存使用

public class main extends ApplicationAdapter 
{ 
    public static int a; 
    public static int b; 
    public static Player player; 

    public void create() 
    { 
     resume(); 
    } 

    public void render() 
    { 
    } 

    public void resize() 
    { 
    } 

    //pause runs when home button is pressed 
    public void pause() 
    { 
     player = null; 
    } 

    //resume runs when the program is re-opened 
    public void resume() 
    { 
     a = 10; 
     b = 20; 
     player = new Player(); 
    } 
} 

在Android上,按下home鍵時,該程序保存在內存和靜態變量保持它們的值。現在,當這個程序重新打開時,這個例子是否創建了新的靜態變量或者只是將值分配給內存中的舊靜態變量?

我這麼問是因爲我有了一個問題,即按家庭和重新打開程序導致內存每次增加,我想知道,如果這能起到爲什麼發生作用的程序。

更新:請問選手對象獲取從內存中刪除當它再被創建之前宣佈無效?

+0

運行調試,並看看會發生什麼。最好的方法來找出IMO –

回答

0

創造新的靜態變量或只是分配值到舊的靜態變量這是在內存中?

只通過resume()方法將值分配給a,b

靜態變量初始化一次,在執行的開始。

編輯

你正在創建的Player新對象,並分配給player參考變量。之後你就沒有老玩家對象的引用,所以當JVM覺得需要運行垃圾回收器時,垃圾回收器會運行並清除舊玩家對象的內存。

+0

感謝您的答案,這是最初的想法,但我想我可能是錯的。靜態對象呢?我想我在回覆後更新了我的問題。 – ace106

+0

我認爲在'resume()'中創建對象是沒有意義的。 – Aryan

+0

在我編寫的程序中,每次按住home時我的內存分配都會增加,然後重新打開程序。它每次增加大約1.5-2 MB。該程序開始分配約5 MB,我已經使用家庭/重新打開了約16 MB。我試過甚至強制垃圾收集器運行,但它並沒有減少分配的內存。垃圾收集器是否會立即刪除分配的內存,這意味着我確實有內存問題,或者它是否在自己的時間內執行了內存問題,並且可能不存在問題?如果你不知道,那很好。剛剛想到我會問。 – ace106

2

靜態引用的生命週期是不一樣的應用程序的生命週期。換句話說,您的應用程序的多個實例可能使用相同的靜態變量。

如果您在您的應用程序,那麼你將它設置爲null在同一個虛擬機上運行應用程序的所有實例的方法設置一個靜態變量來null。設置對null的引用,但是並不意味着內存實際上是空閒的。只有當沒有對同一對象的其他引用並且運行垃圾收集器時,該對象纔會被刪除。

也就是說,請注意,pauseresume方法不是正確的方法來做這樣的事情。事實上,對於上述原因,你應該從來不使用static關鍵字在所有的東西都是特定於應用程序的一個實例,除非你是正確管理這些static引用。例如,libgdx通過保留應用程序實例和他們使用的資源的映射來在後臺執行此操作。這使您可以擁有「託管資源」,並在需要時自動重新加載(這是默認設置)。

在你的情況下,這將是複雜的事情,它是更容易,只需刪除static關鍵字。這通常也迫使你有一個更好的面向對象的設計,而不是使用像例如單一模式通常也會導致長期的其他問題。