我的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的堆内存?难道我做错了什么?