为什么每次按下按钮时内存使用量都会增加,因为我已将指针设置为 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);
}
}
最佳答案
将变量设置为 null
不会释放内存。只有当垃圾收集器决定内存对于某些其他操作是必需的并且必须回收时,才会释放内存。
内存永远不会完全有可能被释放,即使垃圾收集器运行了多次也是如此。
更新
我想我明白您对释放内存的担忧从何而来。在 Java 中,内存是在堆 上分配的。不管您是否意识到,Java 都配置了最大堆大小(您可以在命令行上指定这个最大值)。假设 Java 运行时最大堆大小为 100MB。现在,假设您的程序已经分配了其中的 5MB。操作系统看到 Java 使用(大约 5MB),因为这就是 Java 此时从操作系统请求的所有内容。随着您的程序运行,将继续分配越来越多的内存直到达到最大堆大小 (100MB)。到那时,大多数垃圾收集器会更积极地释放内存。在那之前,许多垃圾收集器可能根本不会费心释放内存。
因此,您不必担心 Java 会从您的操作系统中消耗越来越多的内存。
关于java字节数组内存未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5449014/