2012-07-03 175 views
2

我在Java和Swing中遇到了一些內存問題。我有一個JTextArea(與JTextPane相同的問題),我用它來從C++可執行文件重定向stdout。而且因爲我輸出了很多標準輸出,所以JTextPane消耗了很多空間。無論如何,我把它歸結爲下面的代碼,全部用Java編寫。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與我所有的其他代碼&用戶界面)。我如何減少Java的內存使用量?目前正在使用Java 7更新4.

在此先感謝。

+0

是的,'JTextArea'也有很多功能;有些你可能不需要。你的實際要求是什麼? – trashgod

+0

我主要想從我的C++程序中顯示我的stdout(和stderr)。我只是不明白所有的記憶在哪裏。 – jobobo

回答

4

我只是不明白所有的內存在哪裏。

PlainDocument講述的故事:無論是每碼點的一個或兩個16位代碼單元,圖線的開始,所有的輜需要使其可編輯。對於只讀查看,我會使用重定向:yourprogram 2>&1 > view。在Java中,您可以從stdin讀取到List<String>,每行一個String,並使用JTable查看它。默認renderer非常有效。有一個相關示例here

+0

我需要重定向,以便我可以讀取來自stdout/stderr的信息。 JTable的?從來沒有考慮過,但也許這是一條路。對於我上面的代碼,我以某種方式認爲覆蓋我以前的字符串(通過.setText())將釋放垃圾收集的前一個字符串。記憶力正在不斷增長,好像它在泄漏記憶。有關使上述代碼有效的任何線索?謝謝。 – jobobo

+0

您需要分析您的實際代碼,看看是否還有其他工作可以完成。如果你不使用'JTable',你會想模擬它使用flyweight模式進行渲染。 – trashgod

+0

對於一個好的分析器的任何建議?謝謝。 – jobobo