java字节数组内存未发布

时间:2011-03-27 11:48:26

标签: java memory

为什么每次按下按钮时内存使用量都会增加,因为我已将指针设置为NULL? (附上代码)

这使我的程序继续增加内存使用量。

感谢。

package newHashFunction;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Memory_not_released extends JFrame{

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Memory_not_released memory_not_released=new Memory_not_released();
    }

    Memory_not_released(){
        JButton button1=new JButton("create bytes");

        button1.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                byte[] byte1=new byte[10000000];
                byte1=null;
            }});

        add(button1);

        this.pack();
        setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

}

3 个答案:

答案 0 :(得分:5)

将变量设置为null不会释放内存。只有当垃圾收集器决定某些其他操作需要内存并且必须恢复时,才会释放内存。

即使垃圾收集器已多次运行,内存完全有可能永远不会被释放。

<强>更新

我想我明白你对释放记忆的关注来自哪里。在Java中,内存分配在上。无论您是否意识到,Java都配置了最大堆大小(您可以在命令行上指定此最大值)。假设Java运行时的最大堆大小为100MB。现在,假设您的程序已经分配了5MB。操作系统看到Java使用(大约5MB),因为这是Java在操作系统中请求的所有内容。随着程序的运行,将继续分配越来越多的内存,直到达到最大堆大小(100MB)。那时,大多数垃圾收集者在释放内存时会更积极。在那之前,许多垃圾收集者可能根本不打扰释放内存。

因此,您无需担心Java会从您的操作系统中消耗越来越多的内存。

答案 1 :(得分:2)

按下每个按钮分配10,000,000个字节。将变量设置为null将允许释放这些字节,但直到下次运行垃圾收集器时才会释放。当发生这种情况可能是任意的,而且肯定不是即时的。您可以尝试通过执行以下操作强制VM运行垃圾收集器:

byte[] byte1=new byte[10000000];
byte1=null;
System.gc();

答案 2 :(得分:0)

这是因为在垃圾收集器启动之前不会销毁字节数组。