在我的安卓游戏中,我将整个游戏场景/关卡包裹在GameScene对象中。我希望一旦参考被新的GameScene取代,GameScene对象就会被垃圾收集。不幸的是,我有很多内存泄漏,每次更改级别,内存堆都会增长。这种情况发生在游戏因内存完全错误而崩溃之前。我已经使用了eclipse Mat,它警告我GameScene可能存在泄漏。我修好了它,所以它不再出现在Mat上了。在eclipse中擅长调试的人是否知道如何确定哪些对象没有被垃圾收集?我甚至不确定GameScene是否被垃圾收集。下面的代码给出了一个简短的例子,说明我如何调用Engine来创建和覆盖正在运行的GameScene中的当前GameScene以创建下一个级别。
class GameScene{
//lots of methods and objects...
@Override
public void onClick(float x, float y) {
// TODO Auto-generated method stub
Engine.destroyScene();
Engine.setScene(new GameScene(context, "chapters/classic/2/"));
}
}
class SceneManager{
public Scene currentScene;
public void destroyScene() {
sceneLoaded = false;
currentScene.destroyScene();
currentScene = null;
}
public void setScene(Scene scene) {
currentScene = scene;
}
public void loadScene() {
currentScene.loadScene();
sceneLoaded = true;
}
}
class Engine{
public static void destroyScene(){
sceneManager.destroyScene();
resourceManager.deleteAllTextures();
}
public static void setScene(Scene scene) {
sceneManager.setScene(scene);
}
}
答案 0 :(得分:0)
您可以使用VisualVm(包含在JDK中)之类的探查器来查看内存状态,每个对象的实例数以及其他有用信息。
在你的情况下,我会在开始时拍摄内存的快照,然后浏览游戏场景并拍摄另一张快照以与第一张快照进行比较。 VisualVM提供的另一个选项是在发生OutOfMemoryException时生成堆转储,然后您可以查找问题的来源。