关于垃圾回收(内存管理)的一点疑问
import javax.swing.*;
import java.awt.event.*;
import java.awt.FlowLayout;
import java.awt.Dimension;
import java.lang.String;
import javax.swing.JOptionPane;
import java.awt.Container;
import java.util.Hashtable;
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.DefaultListCellRenderer;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
class ComboBoxRenderer
implements ListCellRenderer {
public ComboBoxRenderer() {
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
JLabel itemLabel = new JLabel(value);
JPanel itemPanel = new JPanel();
itemPanel.setToolTipText(sValue);
itemPanel.setSize(list.getSize().width, 25);
itemPanel.setLayout(new BorderLayout());
itemPanel.add(itemLabel, BorderLayout.WEST);
if (isSelected || cellHasFocus) {
itemPanel.setForeground(list.getSelectionForeground());
itemPanel.setBackground(list.getSelectionBackground());
}
else {
itemPanel.setForeground(list.getForeground());
itemPanel.setBackground(list.getBackground());
}
return itemPanel;
}
}
public class test extends JFrame{
JComboBox select=null;
JButton button=null;
consuMem mem=null;
String preItem=null;
Hashtable sessionTable=new Hashtable();
public test(String title) {
super(title);
setSize(new Dimension(200,100));
getContentPane().setLayout(new FlowLayout());
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
select=new JComboBox();
select.setRenderer(
new ComboBoxRenderer(ComboBoxRenderer.COMBOTYPE_TEMPLATE));
for (int i=0;i<200;i++) {
select.addItem(String.valueOf(i));
}
select.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
}
});
getContentPane().add(select);
}
public static void main(String[] args) {
sessionWindow swindow=null;
test test1=new test("MainWindow");
test1.show();
}
}
以上程序主要是自己实现一个ListCellRenderer类,调试,用键盘在combobox的item中反复上下切换,观察内存继续增长,怀疑是 JLabel itemLabel = new JLabel(value);
JPanel itemPanel = new JPanel();
这两句的问题,因为它们每次都会分配新的对象,于是将ComboBoxRenderer类改为如下形式:
class ComboBoxRenderer
implements ListCellRenderer {
public static JLabel itemLabel = new JLabel();
public static JPanel itemPanel = new JPanel();
private int type_;
public ComboBoxRenderer(int type) {
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
if (value == null) {
return null;
}
itemLabel.setText(value);
itemPanel.setToolTipText(sValue);
itemPanel.setSize(list.getSize().width, 25);
itemPanel.setLayout(new BorderLayout());
itemPanel.add(itemLabel, BorderLayout.WEST);
if (isSelected || cellHasFocus) {
itemPanel.setForeground(list.getSelectionForeground());
itemPanel.setBackground(list.getSelectionBackground());
}
else {
itemPanel.setForeground(list.getForeground());
itemPanel.setBackground(list.getBackground());
}
return itemPanel;
}
}
发现不会出现上面的现象了。但是我不大理解为什么会这样,按道理说,JVM每次getListCellRendererComponent()绘制完后,对它们的引用就会消失,内存也会被回收,为什么会出现上面的现象内,哪位大侠能够给解释一下,谢谢了