如何将Java Swing组件注册到垃圾收集?
我有一个应用程序来显示用户数据的图像。其中每个用户都有一个以上的图像数据。 当我在JTable中选择用户时,我的图像数据显示在JPanel中。这张图片实际上也有背景图片 我的问题是,内存消耗总是增加,而不是减少。有时应用程序挂起。 如何将图片(JPanel)注册到垃圾收集。如果可能的话,我什么时候必须注册? 我是Java性能方面的新手 这是我的代码:如何将Java Swing组件注册到垃圾收集?,java,swing,garbage-collection,jcomponent,Java,Swing,Garbage Collection,Jcomponent,我有一个应用程序来显示用户数据的图像。其中每个用户都有一个以上的图像数据。 当我在JTable中选择用户时,我的图像数据显示在JPanel中。这张图片实际上也有背景图片 我的问题是,内存消耗总是增加,而不是减少。有时应用程序挂起。 如何将图片(JPanel)注册到垃圾收集。如果可能的话,我什么时候必须注册? 我是Java性能方面的新手 这是我的代码: public void getStreamData(final PanelEntry view, final String data) {
public void getStreamData(final PanelEntry view, final String data) {
String files = null;
String path = null;
if(isImages()) {
path = "data/"+data+"/images";
} else {
path = "data/"+data+"/videos/thumbs";
}
File folder = new File(path);
// Always remove previous image label when new data selected
view.getPanelStream().removeAll();
if (!folder.exists()) {
JLabel label = new JLabel("No Stream Data");
label.setForeground(Color.red);
label.setVisible(true);
// Adding to panelGallery
view.getPanelStream().add(label);
view.getPanelStream().revalidate();
view.getPanelStream().repaint();
} else {
File [] listOfFiles = folder.listFiles();
int maxFiles = listOfFiles.length;
int maxView = 15;
// Loop for get image from file
for (int i = listOfFiles.length; i > 0 ; i--) {
if(listOfFiles[i].isFile()) {
files = listOfFiles[i].getName();
final String videoFiles = files;
if(files.endsWith(".jpg") || files.endsWith(".JPG") ||
files.endsWith(".jpeg") || files.endsWith(".JPEG") ||
files.endsWith(".png") || files.endsWith(".PNG")) {
final String newPath = path+"/"+files;
try {
File showFile = new File(newPath);
ImageIcon imgSource = new ImageIcon(newPath);
JPanel labelGallery = new BackgroundImageRounded(showFile);
labelGallery.setLayout(null);
labelGallery.setPreferredSize(new Dimension(160, 120));
labelGallery.setVisible(true);
JLabel labelName = new JLabel(files);
labelName.setSize(150,15);
labelName.setLocation(8, 8);
labelName.setVisible(true);
labelName.setForeground(Color.ORANGE);
labelGallery.add(labelName);
String videoPath = "data/"+data+"/videos/";
String video = videoFiles.replace(".jpg", ".wmv");
String videoFile = video.replace("thumb_", "video_");
final String videoPlayer = videoPath+videoFile;
if (isImages()) {
labelGallery.setToolTipText("View Image");
} else {
labelGallery.setToolTipText("Play Video");
JLabel iconPlayer = new JLabel();
iconPlayer.setIcon(new ImageIcon(getClass().getResource("/com/ikbiz/gastroscope/resources/player.png")));
iconPlayer.setSize(61,42);
iconPlayer.setVisible(true);
iconPlayer.setLocation(50, 35);
labelGallery.add(iconPlayer);
}
labelGallery.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(isImages()) {
ImageViewer viewer = new ImageViewer(newPath);
viewer.setVisible(true);
} else {
VideoViewer videoViewer = new VideoViewer();
videoViewer.setViewer(videoPlayer);
videoViewer.setLocationRelativeTo(null);
videoViewer.pack();
videoViewer.setVisible(true);
}
}
});
// Adding to panelGallery
view.getPanelStream().add(labelGallery);
view.getPanelStream().revalidate();
view.getPanelStream().repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
请帮忙
谢谢。您应该使用内存分析器来了解发生了什么 在这里,您谈到注册
JPanel
,但如何100%确定这是一种消耗内存的对象
我认为你应该:
如果没有更多信息,您只是猜测代码的某些部分一定是罪魁祸首,但您没有任何线索。当对象不再有任何强引用时,它们将有资格进行垃圾收集。您使用的代码“似乎”没有创建任何我可以看到的重要的强引用,但是您最好在其上运行一个探查器。您如何度量内存消耗?配置文件或至少
jconsole
应该会给您一些内存消耗位置的提示。我只是在任务管理器中查看内存消耗,每次加载图像数据内存都会增加+-13MB。我只是使用removeAll()删除,我已经读过,removeAll()不影响垃圾收集。无关:a)不要进行任何手动大小调整/定位,而是使用合适的布局管理器b)您将破坏大小调整提示的任何内部计算