사용자 데이터의 이미지를 보여주는 응용 프로그램이 있습니다. 각 사용자가 두 개 이상의 이미지 데이터를 가지고있는 곳. JTable에서 사용자를 선택하면 내 이미지 데이터가 JPanel에 표시됩니다. 그림은 실제로 배경 이미지가있는 JPanel입니다.Java Swing Component를 Garbage Collection에 등록하는 방법은 무엇입니까?
제 질문은 메모리 사용량이 항상 증가하고 줄어들지 않습니다. 때로는 응용 프로그램이 중단됩니다. 그림 (JPanel)을 가비지 수집에 등록하는 방법. 가능하다면 언제 등록해야합니까? Java에서 성능 문제가 발생했습니다.
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();
}
}
}
}
}
}
이 도와주세요,
감사합니다 :이
내 코드입니다.
개체에 대한 강력한 참조가 없어지면 개체가 가비지 수집 대상이됩니다. 사용하고있는 코드는 내가 볼 수있는 중요한 참조를 만드는 것처럼 보이지는 않지만, 프로파일 러를 사용하는 것이 더 낫습니다. – MadProgrammer
어떻게 메모리 소비를 측정합니까? 프로파일 또는 적어도'jconsole'은 메모리가 소비되는 몇 가지 힌트를 제공해야합니다. –
난 그냥 작업 관리자에서 메모리를 소비 볼 때, 모든로드 이미지 데이터 메모리는 항상 증가 - 13 메가 바이트. 난 그냥 removeAll()을 사용하여 제거하고 이미 읽고, removeAll() 가비지 수집에 영향을주지 않습니다. – fanjavaid