簡體   English   中英

Java字節數組內存未釋放

[英]java byte array memory not released

為什么每次將按鈕設置為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從操作系統中消耗越來越多的內存。

每按一次按鈕分配10,000,000字節。 將變量設置為null將允許釋放這些字節,但要等到下一次垃圾收集器運行時才能釋放。 發生這種情況可能是任意的,並且肯定不是即時的。 您可以嘗試通過以下方式強制VM運行垃圾回收器:

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

這是因為在垃圾回收器啟動之前,字節數組不會被破壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM