为什么每次按下按钮时内存使用量都会增加,因为我已将指针设置为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);
}
}
答案 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)
这是因为在垃圾收集器启动之前不会销毁字节数组。