为什么Libgdx不断增加堆积?

时间:2017-09-28 08:31:10

标签: memory-leaks libgdx heap

为什么堆积没有原因?如果你说使用gc,我仍然想知道为什么要上升?

这是我的代码:

public class GameCore extends ApplicationAdapter {
    SpriteBatch batch;
    Texture texture;
    StopWatch sw = new StopWatch();
    long current, held;

    @Override
    public void create() {
        batch = new SpriteBatch();
        texture = new Texture(Gdx.files.internal("badlogic.jpg"));
        sw.start();
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.draw(texture, 0, 0);
        batch.end();

        if (Gdx.app.getJavaHeap() > held) {
            current = Gdx.app.getJavaHeap();
            held = current;
            String f = "UP: " + Mis.formatMilliseconds(sw.getCurrent()) + "\t"
                    + Mis.ramStatistics(Mis.BYTE_TO_MB_FACTOR, true) + "\t, byGdx:" + Gdx.app.getJavaHeap();
            System.out.println(f);
        } else if (Gdx.app.getJavaHeap() < held) {
            // if gc worked
            held = current;
            String f = "DOWN: " + Mis.formatMilliseconds(sw.getCurrent()) + "\t"
                    + Mis.ramStatistics(Mis.BYTE_TO_MB_FACTOR, true) + "\t, byGdx:" + Gdx.app.getJavaHeap();
            System.out.println(f);
        }
    }

    @Override
    public void dispose() {
        batch.dispose();
    }
}

不幸的结果:

UP: 1 ms    Heap: (11/1796) MB, 0.59153545% , byGdx:11140048
UP: 58 sec, 58171 ms    Heap: (12/1796) MB, 0.62772965% , byGdx:11821672
UP: 1 min, 111 sec, 111705 ms   Heap: (12/1796) MB, 0.66392213% , byGdx:12503264
UP: 32 min, 1978 sec, 1978210 ms    Heap: (25/1796) MB, 1.3516115%  , byGdx:25454120
UP: 48 min, 2887 sec, 2887645 ms    Heap: (31/1796) MB, 1.6773589%  , byGdx:31588736

增加56分钟(最多34mb)后,gc清理(26mb),libgdx再次开始增加堆大小,没有特别的原因。

什么推动我问这个问题是一个非常微小的游戏只有2个纹理,libgdx在2分钟内造成66mb,我以为我错误地使用了libgdx,但我不是。

1 个答案:

答案 0 :(得分:2)

Java是一种托管语言,这意味着它(JVM / GC)为您管理内存。因此,除非您遇到实际问题(例如,内存不足),否则仅根据总体内存使用量添加任何结论通常并不十分有用。就你所知,JVM / GC可能从未发布任何(临时)对象,只是因为没有理由这样做。

如果您认为由于内存使用过多(例如内存不足)导致确实存在问题,那么您最好使用分析器来实际查看正在进行的操作。但是根据您的描述,您似乎没有实际问题。

相关问题