java字节数组内存未释放

标签 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);
    }

}

最佳答案

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

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

更新

我想我明白您对释放内存的担忧从何而来。在 Java 中,内存是在 上分配的。不管您是否意识到,Java 都配置了最大堆大小(您可以在命令行上指定这个最大值)。假设 Java 运行时最大堆大小为 100MB。现在,假设您的程序已经分配了其中的 5MB。操作系统看到 Java 使用(大约 5MB),因为这就是 Java 此时从操作系统请求的所有内容。随着您的程序运行,将继续分配越来越多的内存直到达到最大堆大小 (100MB)。到那时,大多数垃圾收集器会更积极地释放内存。在那之前,许多垃圾收集器可能根本不会费心释放内存。

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

关于java字节数组内存未释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5449014/

相关文章:

java - 生成的 DisplayTag 排序和分页链接(url)太长

java - Android:无法实例化应用程序错误

java - 小于 ObjectOutputStream 基元的基元数组

c++ - 堆栈和堆地址区域在 Windows 和 Linux 中是不同的

Java Maven Tomcat7 :run java memory options for jvm

java - Jersey 2 : My ApplicationEventListener is being ignored. 如何解决此问题?

java - 如何创建一个使用数组来计算元音的程序?

iphone - 返回一个没有泄漏的数组!

java - 如何正确地将数组添加到集合中?

java - 堆空间内存不足