0

ユーザーのデータの画像を表示するアプリケーションがあります。各ユーザーが複数の画像データを持っている場合。JTable でユーザーを選択すると、画像データが JPanel に表示されます。写真は実際には背景画像付きのJPanelでもあります。

私の質問は、メモリ消費量は常に増加し、減少しないということです。アプリケーションがハングすることがあります。画像(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();
                        }
                    }
                }
            }
        }
    }

助けてください、

ありがとうございました。

4

1 に答える 1

0

メモリ プロファイラを使用して、何が起こっているかを調べる必要があります。

ここでは、 の登録JPanelについて説明していますが、これがメモリを消費する種類のオブジェクトであることをどのように 100% 確信できるのでしょうか?

私はあなたがすべきだと思います:

  1. ヒープ使用率をプロファイリングする
  2. 多くのメモリを消費するオブジェクトを見つける
  3. インスタンス化されている場所を見つける
  4. それらが GC によって再利用されない理由を見つけます (それらにリンクしている GC ルートは何ですか)。

詳細な情報がなければ、コードの一部が原因であるに違いないと推測しているだけですが、手がかりがありません。

于 2013-07-17T11:58:25.153 に答える