【问题标题】:will Texture declaration in method scope cause memory leak?方法范围内的纹理声明会导致内存泄漏吗?
【发布时间】:2011-06-26 13:16:53
【问题描述】:

不知这段代码会不会造成内存泄漏?因为我仍然不知道什么时候应该处理纹理。纹理应该放在方法的末尾吗?还是不用后单独处理?

private void loadAssets() {
    Texture texture = new Texture(Gdx.files.internal("data/controls.png"));
    TextureRegion[] buttons = TextureRegion.split(texture, 64, 64)[0];
    left = buttons[0];
    right = buttons[1];
    jump = buttons[2];
    cubeControl = buttons[3];
    cubeFollow =  TextureRegion.split(texture, 64, 64)[1][2];
    dpad = new TextureRegion(texture, 0, 64, 128, 128);     
    batch = new SpriteBatch();
    batch.getProjectionMatrix().setToOrtho2D(0, 0, 480, 320);
}

我真的不明白。为什么Java中仍然存在内存泄漏?

【问题讨论】:

  • 解决“为什么Java中仍然存在内存泄漏”,即使Java有GC,但它仍然可能存在内存泄漏(但技术上与c/c++不同)。当您(直接/间接)实例化一个对象并且代码在某处维护对它的模糊引用时,通常会发生这种情况。该对象将永远不会被 GC。这就是我们在 Java 中所说的内存泄漏

标签: java textures libgdx


【解决方案1】:

查看TextureRegion 的来源,它保留了对Texture 的引用,但并没有真正获得它的“所有权”——它永远不会自己处置它。

按照这种方式,您不应该在方法结束时将其丢弃,但您应该cubeFollowcubeControldpad 都完成了 - 我怀疑实例本身完成时会完成。 (这可能意味着您需要终结器,也可能不意味着 - 这取决于您是否可以控制此对象的生命周期。)

请注意,您不需要单独的字段来存储对 Texture 的引用 - 您可以使用 dpad.getTexture()dpad 获取它。

【讨论】:

    猜你喜欢
    • 2015-08-22
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 2011-08-16
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    相关资源
    最近更新 更多