Java 游戏场景不是垃圾收集
在我的android游戏中,我将整个游戏场景/关卡包装在一个游戏场景对象中。我希望一旦引用被新的GameSecene替换,GameSecene对象将进行垃圾收集。不幸的是,我有严重的内存泄漏,每次更改级别时,内存堆都会增加。这会一直发生,直到游戏因内存满错误而崩溃。我已经使用了EclipseMat,它警告我游戏场景中可能存在漏洞。我把它修好了,这样它就不会再出现在垫子上了。擅长在eclipse中调试的人知道我如何知道哪些对象没有被垃圾收集吗?我甚至不确定游戏场景是否被垃圾收集。下面的代码只是给出了一个简短的示例,说明了我如何调用引擎在运行的游戏场景中创建和覆盖当前游戏场景,以创建下一个级别Java 游戏场景不是垃圾收集,java,android,eclipse,Java,Android,Eclipse,在我的android游戏中,我将整个游戏场景/关卡包装在一个游戏场景对象中。我希望一旦引用被新的GameSecene替换,GameSecene对象将进行垃圾收集。不幸的是,我有严重的内存泄漏,每次更改级别时,内存堆都会增加。这会一直发生,直到游戏因内存满错误而崩溃。我已经使用了EclipseMat,它警告我游戏场景中可能存在漏洞。我把它修好了,这样它就不会再出现在垫子上了。擅长在eclipse中调试的人知道我如何知道哪些对象没有被垃圾收集吗?我甚至不确定游戏场景是否被垃圾收集。下面的代码只是给出
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);
}
}
您可以使用VisualVm(包含在JDK中)这样的探查器来查看内存状态、每个对象的实例数和其他有用信息
在您的情况下,我会在开始时拍摄内存快照,然后浏览游戏场景并拍摄另一个快照与第一个快照进行比较。VisualVM提供的另一个选项是在发生OutOfMemoryException时进行heapdump,然后您可以通过它查找问题的根源。不幸的是,您发布的代码中没有显示泄漏<代码>当前场景=空代码>确实有效。一定有什么东西泄漏了。发布
场景#destroyScene
代码。destroyScene中只有jni调用。我通过在游戏场景中的对象前面添加static修复了其中的一半。