java字节数组内存未发布

mic*_*123 1 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

Ada*_*ter 5

将变量设置为null不释放内存.仅当垃圾收集器确定某些其他操作需要内存且必须恢复时才释放内存.

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

更新

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

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