2012-07-03 7 views
2

Java 및 Swing에 메모리 문제가 있습니다. 나는 (JTextPane과 동일한 문제)을 사용하여 C++ 실행 파일에서 stdout을 리디렉션합니다. 그리고 나는 많은 표준 출력을 출력하기 때문에 JTextPane은 많은 공간을 소비합니다. 어쨌든, 나는 자바로 다음 코드를 작성했다.JTextArea가 많은 메모리를 사용합니다.

private javax.swing.JTextArea jtextareastdout; 
.... 

for (int i = 0; i < 200000; i++) { 
    String randomstr = UUID.randomUUID().toString(); 

    jtextareastdout.setText(randomstr); //<tag_memory> 
    if (i % 100 == 0) 
     System.gc(); //<tag_no_help> 
} 

위의 코드는 100MB를 소비합니다. tag_memory 라인이 주석 처리 된 상태에서, 훨씬 적은 양 (30MB와 다른 모든 코드 & UI). Java의 메모리 사용을 줄이려면 어떻게해야합니까? 현재 Java 7 업데이트 4를 사용 중입니다.

미리 감사드립니다.

+0

네,'JTextArea'도 많은 기능을 가지고 있습니다. 일부는 필요하지 않을 수도 있습니다. 실제 요구 사항은 무엇입니까? – trashgod

+0

저는 주로 내 C++ 프로그램에서 stdout (및 stderr)을 보여주고 싶습니다. 나는 모든 기억이 어디로 가고 있는지 이해하지 못한다. – jobobo

답변

4

나는 모든 메모리가 어디로 가고 있는지 이해하지 못한다.

PlainDocument는 이야기 : 하나의 코드 포인트 당 하나 또는 두 개의 16 비트 코드 단위는, 라인의지도를 시작하고 모든 방해물이 편집 가능하게 할 필요가 있었다. 읽기 전용보기의 경우 리디렉션을 사용합니다 (yourprogram 2>&1 > view). 자바에서는 stdin에서 List<String>으로, 한 줄에 하나는 String으로 읽을 수 있으며 JTable으로 볼 수 있습니다. renderer의 기본값은 매우 효율적입니다. 관련된 예가 here입니다.

+0

stdout/stderr에서 오는 정보를 읽을 수 있도록 리디렉션해야합니다. JTable? 결코 그것을 고려하지 않았지만 어쩌면 그것이 갈 길입니다. 위의 코드에서, 나는 어떻게 든 이전의 문자열을 덮어 쓰면 (.setText()를 통해) 가비지 콜렉션의 이전 문자열을 해제 할 수 있다고 생각했습니다. 메모리가 누수되는 것처럼 메모리가 계속 커집니다. 위의 코드가 작동하도록하는 데 어떤 단서가 있습니까? 감사. – jobobo

+0

다른 작업을 수행 할 수 있는지 알아 보려면 실제 코드를 프로파일 링해야합니다. 'JTable'을 사용하지 않는다면, 렌더링을 위해 플라이 웨이트 패턴을 사용하는 것을 에뮬레이트하고 싶을 것이다. – trashgod

+0

좋은 프로파일 러에 대한 제안 사항이 있습니까? 감사. – jobobo

관련 문제