用于局部变量的java内存分配

时间:2014-05-20 07:21:35

标签: java memory jtextpane

我有一个使用 SerialPortEvent 的java应用程序,它将被连续调用,

public void serialEvent(SerialPortEvent evt) {

    if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            StringBuilder sBuilder = new StringBuilder();
            int length = input.available();
            byte[] array = new byte[length];
            int numBytes = input.read(array);
.......
......
}

我在文本窗格中打印数组变量内容。 我有一个场景,其中事件将被连续调用,它使Windows内存(私人工作集)逐渐增加,并且不会停止。

我的问题是,每次调用事件时是否创建新的变量都会占用内存?

我只是获取内容并将其打印在JTextpane中,而不是其他内容。

2 个答案:

答案 0 :(得分:3)

这样创建变量不会造成内存泄漏。当你在某个地方保留对局部变量的引用时就会发生泄漏。

我的猜测是,您最终会将sBuilder的内容附加到JTextpane,这当然会永久保留内容。

解决方案是检查JTextpane(行数)的长度。如果有太多,那么删除一些。这样,你总是在内存中保留1000行,并且消耗将被检查。

相关:

答案 1 :(得分:0)

当然创建新变量会增加程序使用的内存但是除非你保持对它们的强引用(通过阅读你发布的几行代码很难说)这个内存应该在下一次垃圾收集时释放周期。现在,我不是一个java大师,我不知道JTextPane是如何工作的,但是如果它在显示它时将整个字符串保留在内存中(最有可能)我会期望该字符串所需的内存不断每次我添加内容时都会增加。但是,如果您看到的增加远远超过您在文本窗格中写入的字节数,那么我会四处查看保留的强引用(或循环引用)。请注意,您始终可以通过调用System.gc()提示垃圾收集器运行,但这只是对收集器的一个提示,无论是否运行,它都取决于它。