我的Java(.jar)程序访问数据库并将值存储为 private ArrayList <String []> (全局变量),以便在显示的JFrame中多次使用 .

数据存储如下:给定表的每一行都作为Array存储在ArrayList中 . 因此,此ArrayList包含来自给定表的所有所需数据 . 使用此方法可以提高程序的速度,因为使用预先存储的ArrayList多次访问数据比访问数据库本身更快 .

问题是每当执行 JFrame.dispose() 以便打开另一个JFrame时,垃圾收集器都不会释放ArrayList的已分配空间(即使不再引用这些ArrayLists)并继续在堆上占用(和堆叠)空间记忆 . 每次处理时,再输入另一个帧,根据JFrame需要的数据创建多个KB到几MB的ArrayLists . 最后达到最大堆空间并抛出 java.lang.OutOfMemoryError: Java heap space error .

除非程序关闭并再次打开,否则内存会不断堆叠 . 请注意 System.gc() 不起作用 .

一个JFrame示例:

import java.util.ArrayList;

public class Test extends javax.swing.JFrame {

   private javax.swing.JButton GenerateB;

    public Test() {
        initComponents();
    }

    //To create the JButton:
    private void initComponents() {
        GenerateB = new javax.swing.JButton();
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());
        GenerateB.setText("Generate");
        GenerateB.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                GenerateBActionPerformed(evt);
            }
        });
        getContentPane().add(GenerateB, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, -1, -1));
    }

    //Code executed when the button is clicked. 
    //Clicking the button tens of times will fill the memory heap till it runs out of memory, even though there is no reference to the ArrayLists created
    //Note: calling Text.dispose() will not free the used up space.
    private void GenerateBActionPerformed(java.awt.event.ActionEvent evt) { 
        ArrayList<String[]> A = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            String[] S = {i + "", i + i + "", i + i + i + "", i + i + i + i + ""};
            A.add(S);
        }
    }
}

有没有办法“清理”那些Arrays / ArrayLists的堆内存?难道我做错了什么?