gpt4 book ai didi

java - 了解使用 map 和 vector 时垃圾收集器在 Java 7 中的工作原理

转载 作者:行者123 更新时间:2023-12-01 12:49:49 26 4
gpt4 key购买 nike

我一直在阅读一些关于 Java 中垃圾收集器如何工作的内容,但我不确定是否正确理解它实际上在做什么。所以我一直在创建一个丑陋的程序......

它唯一做的事情是:

  • 点击“添加”按钮,创建一个包含 80K 元素的 TreeMap,并将其添加到 vector 中
  • 您点击“删除”按钮,然后删除 vector 中的最后一个元素

        public class modelTester {
    public static Date getToday(){
    Calendar cal = Calendar.getInstance();
    return getDate(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DAY_OF_MONTH),0,0);
    }

    public static Date getDate(Integer year, Integer month, Integer day, Integer hour, Integer minute){
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.DAY_OF_MONTH, day);
    calendar.set(Calendar.HOUR_OF_DAY, hour);
    calendar.set(Calendar.MINUTE, minute);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
    }

    public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });

    final Vector<TreeMap<Date, Double>> v = new Vector<TreeMap<Date, Double>>();

    JPanel panel = new JPanel(new FlowLayout());
    JButton addButton = new JButton("add data");
    JButton removeButton = new JButton("remove data");
    JButton runGCButton = new JButton("run Garbage Collector");


    panel.add(addButton);
    panel.add(removeButton);
    panel.add(runGCButton);

    frame.getContentPane().add(panel);


    addButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    TreeMap<Date, Double> data = new TreeMap<Date, Double>();
    for (int i =0; i < 80000; i++){
    data.put(new Date(getToday().getTime() - i), new Double(i));
    }

    v.add(data);
    System.out.println("Adding Data => Vector Size = " + v.size());
    }
    });


    removeButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    if(v.size() !=0){
    v.remove(v.size()-1);
    }
    System.out.println("Removing Data => Vector Size = " + v.size());
    }
    });

    runGCButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("Yeah, collecting garbage");
    System.gc();
    }
    });

    frame.setSize(150,150);
    frame.setVisible(true);

    }
    }

添加一些数据然后删除所有内容后,我最终会消耗这种内存。

enter image description here

鉴于我从 vector 中删除 map 时不再有 map 上的引用,为什么程序仍然使用那么多内存?

感谢您的帮助

使用 VISUAL VM 后进行编辑

enter image description here

最佳答案

正如 laune 所说,操作系统不会回收内存。 JVM 在启动时为堆保留最小内存量(使用 Xms 设置配置),并根据需要将其增长到最大内存量(Xmx 设置)。它永远不会将内存释放回操作系统。

要查看实际使用了多少堆空间,可以使用多种工具。 VisualVM是最好的免费工具之一,它会向您显示堆空间使用情况,甚至会给您一个实时直方图,显示每个类的对象使用的内存量。

关于java - 了解使用 map 和 vector 时垃圾收集器在 Java 7 中的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24319914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com