2017-06-04 61 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关键字。这通常也迫使你有一个更好的面向对象的设计,而不是使用像例如单一模式通常也会导致长期的其他问题。