2017-09-28 3 views
1

왜 힙이 아무런 이유없이 올라간다. gc를 사용했다면 왜 계속 올라갈 지 궁금 할 것입니다.Libgdx가 지속적으로 증가하는 이유는 무엇입니까?

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 

(34메가바이트까지) 증가 분 56 후, GC 정리 (26메가바이트), libgdx 다시 시작 특별한 이유없이 힙 크기를 늘립니다.

이 질문을하는 것은 아주 작은 게임인데, libgdx는 2 분 안에 66MB를 발생 시켰고, 나는 libgdx를 잘못 사용하고 있다고 생각했지만, 그렇지 않았습니다.

+0

개체를 메모리에 지속적으로로드하고 있습니까? 프레임마다 이미지를로드하고 있습니까? –

+0

아니, 거기에있는 것 외에는 아무것도 볼 수 없기 때문에. – user3843006

답변

1

Java는 관리되는 언어이므로 JVM/GC가 메모리를 관리합니다. 따라서 실제 문제가 발생하지 않는 한 (예 : 메모리가 부족한 경우) 일반적으로 전체 메모리 사용량에 근거하여 결론을 추가하는 것은 대개 유용하지 않습니다. 아시다시피 JVM/GC는 (임시) 객체를 아직 공개하지 않았을 수 있습니다. 이유가 없기 때문입니다.

너무 많은 메모리 사용으로 인해 문제가 있다고 생각하는 경우 (예 : 메모리가 부족한 경우) 프로파일 러를 사용하여 실제로 무슨 일이 벌어지고 있는지 실제로 확인하는 것이 좋습니다. 그러나 귀하의 설명에서 실제 문제가없는 것처럼 보입니다.

+0

복수 작성을 제한 할 조건이 없다면 답이 의미가 있습니다 – user3843006

+0

무슨 뜻인지 실마리가 없으므로 질문을 다시 할 수 있습니까? – Xoppa

+0

힙 크기 증가는 문자열이나 다른 객체의 생성을 비난하지 않는 IF 문 앞에 발생합니다. 실제로 총 문자열은 13 개였습니다. 생각하지 않습니다. 13 개의 문자열이 힙 크기를 잘못 사용합니다. – user3843006

관련 문제