2013-07-16 4 views
0

사용자 데이터의 이미지를 보여주는 응용 프로그램이 있습니다. 각 사용자가 두 개 이상의 이미지 데이터를 가지고있는 곳. 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(); 
         } 
        } 
       } 
      } 
     } 
    } 

이 도와주세요,

감사합니다 :

내 코드입니다.

+2

개체에 대한 강력한 참조가 없어지면 개체가 가비지 수집 대상이됩니다. 사용하고있는 코드는 내가 볼 수있는 중요한 참조를 만드는 것처럼 보이지는 않지만, 프로파일 러를 사용하는 것이 더 낫습니다. – MadProgrammer

+0

어떻게 메모리 소비를 측정합니까? 프로파일 또는 적어도'jconsole'은 메모리가 소비되는 몇 가지 힌트를 제공해야합니다. –

+0

난 그냥 작업 관리자에서 메모리를 소비 볼 때, 모든로드 이미지 데이터 메모리는 항상 증가 - 13 메가 바이트. 난 그냥 removeAll()을 사용하여 제거하고 이미 읽고, removeAll() 가비지 수집에 영향을주지 않습니다. – fanjavaid

답변

0

메모리 프로파일 러를 사용하여 현재 진행중인 작업을 확인해야합니다.

여기에서 JPanel 등록에 대해 이야기하지만, 이것이 메모리를 소비하는 개체의 종류라고 어떻게 확신합니까?

은 당신이해야한다고 생각 :

  1. 그들이 재생되지 않는 이유가
  2. 가 알아 인스턴스화되는 곳 찾기 메모리
  3. 를 많이 소비하는 객체를 찾아 힙 활용
  4. 프로필 GC로 (그들에게 링크 된 GC 뿌리는 무엇입니까?)

더 많은 정보가 없으면, 당신은 단지 gues입니다. 당신의 코드의 일부가 범인이되어야한다고 노래하지만 당신은 단서가 없습니다.

+0

감사합니다. 저는 프로파일 러를 사용하여 테스트 할 것입니다. – fanjavaid