1

有人介意看看这些代码,看看它们是否存在内存泄漏,它不会太大,但我的程序在运行一段时间后不断崩溃,我不知道如何使用viualvm 即使我已经阅读了好几天了,并且丝毫不知道我在堆转储等中寻找什么。感谢您的帮助, ps 我知道我已经发布了很多代码,但我不知道还能做什么,以便您希望看到问题出现在我身上。如果有帮助,我可以通过电子邮件向您发送完整的程序以供查看。非常感谢您提供的任何帮助。

  public class extraScreenPanel {

    static JPanel screenPanel = new JPanel(new BorderLayout()); 

    public static JPanel extraScreenPanel(int dispNum) 
    {
        JLabel label = new JLabel("" + dispNum + "");
        label.setPreferredSize(new Dimension(800, 600));
        label.setVerticalAlignment( SwingConstants.TOP );
        screenPanel = imgDisp(dispNum);
        label.setForeground(Color.white);
        label.setFont(new Font("Serif", Font.BOLD, 200));
        screenPanel.add(label, BorderLayout.PAGE_END );

        return screenPanel;
    }



    public static JPanel imgDisp(int picNum) {  
        String ref = "C:/PiPhotoPic/pic16.jpg";;
        BufferedImage loadImg = loadImage(ref);  
        JImagePanel panel = new JImagePanel(loadImg, 0, 0);  
        panel.setPreferredSize(new Dimension(800, 600));
        return panel;
    }  


    public static class JImagePanel extends JPanel{  
        private BufferedImage image;  
        int x, y;  
       public JImagePanel(BufferedImage image, int x, int y) {  
            super();  
            this.image = image;  
            this.x = x;  
            this.y = y;  
        }  
        @Override  
        protected void paintComponent(Graphics g) {  
           super.paintComponent(g);  
            g.drawImage(image, x, y, null);  
       }  
    }  


    public static BufferedImage loadImage(String ref) {  
            BufferedImage bimg = null;  
            try {  

              bimg = javax.imageio.ImageIO.read(new File(ref));  
         } catch (Exception e) {  
             e.printStackTrace();  
         } 
         BufferedImage bimg2 = resize(bimg,800,600);//set these to the resolution of extra screens
         return bimg2;  
     }  


     public static BufferedImage resize(BufferedImage img, int newW, int newH) {  
        int w = img.getWidth();  
        int h = img.getHeight();  
        BufferedImage dimg = dimg = new BufferedImage(newW, newH, img.getType());  
        Graphics2D g = dimg.createGraphics();  
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
        g.drawImage(img, 0, 0, newW, newH, 0, 0, w, h, null);  
        g.dispose();  
        return dimg;  
    }  


}

方法的另一部分

public class piPhoto
{
    static int mostRecent = 0;
    static int dispNum = 0;
    static int lastDisp = 0;
    static JPanel picPanel = imgDisp.imgDisp(dispNum);
    static JFrame frame = new JFrame("Pi Photography");
    static JPanel cornerPanel = new JPanel();
    static JPanel bottomPanel = new JPanel();
    static JPanel menuPanel = new JPanel(new BorderLayout());
    static JPanel currentNumPanel = currentNumDisp.currentNumDisp(dispNum);
    static JPanel printPanel = printOptions.printOptions();
    static JPanel buttonPanel = updateButtonPanel.updateButtonPanel(mostRecent);
    static JPanel screen1Panel = new JPanel();
    static JPanel screen2Panel = new JPanel();
    static JPanel screen3Panel = new JPanel();
    static JPanel screen4Panel = new JPanel();
    static JPanel screenPanel12 = new JPanel(new BorderLayout());
    static JPanel screenPanel123 = new JPanel(new BorderLayout());
    static JPanel screenPanel1234 = new JPanel(new BorderLayout());
    static JPanel screensPanel = new JPanel(new BorderLayout());
    static JPanel deskScreen = new JPanel();
    static JPanel wholePanel = new JPanel(new BorderLayout());
    static JPanel wholePanel2 = new JPanel(new BorderLayout());




    public static void launchPiPhoto()
    {
        launchNC4.launch();

        bottomPanel.setPreferredSize(new Dimension(1440, 200));
        buttonPanel.setPreferredSize(new Dimension(1120, 200));
        cornerPanel.setPreferredSize(new Dimension(300,200));
        screen1Panel.setPreferredSize(new Dimension(800,600));
        screen2Panel.setPreferredSize(new Dimension(800,600));
        screen3Panel.setPreferredSize(new Dimension(800,600));
        screen4Panel.setPreferredSize(new Dimension(800,600));
        screensPanel.setPreferredSize(new Dimension(3200,600));
        deskScreen.setPreferredSize(new Dimension(800,600));
        wholePanel.setPreferredSize(new Dimension(4640,900));
        wholePanel2.setPreferredSize(new Dimension(5440,900));
        cornerPanel.setLayout(new BoxLayout(cornerPanel, BoxLayout.PAGE_AXIS));


        picPanel.setPreferredSize(new Dimension(1120, 620));


        //Menu Panel Set-up
        cornerPanel.add(currentNumPanel);
        bottomPanel.add(buttonPanel);
        bottomPanel.add(cornerPanel);
        menuPanel.setPreferredSize(new Dimension(1440, 840));
        menuPanel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        menuPanel.add(bottomPanel, BorderLayout.PAGE_END);
        menuPanel.add(picPanel, BorderLayout.LINE_START);
        menuPanel.add(printPanel, BorderLayout.LINE_END);

        screen1Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent - 3);
        screen2Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent - 2);
        screen3Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent - 1);
        screen4Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent);
        screenPanel12.add(screen1Panel, BorderLayout.LINE_START);
        screenPanel12.add(screen2Panel, BorderLayout.LINE_END);
        screenPanel123.add(screenPanel12, BorderLayout.LINE_START);
        screenPanel123.add(screen3Panel, BorderLayout.LINE_END);
        screenPanel1234.add(screenPanel123, BorderLayout.LINE_START);
        screenPanel1234.add(screen4Panel, BorderLayout.LINE_END);
        screensPanel.add(screenPanel1234, BorderLayout.LINE_END);
        deskScreen = extraScreenPanel.extraScreenPanel(dispNum);

        wholePanel.add(menuPanel, BorderLayout.LINE_START);
        wholePanel.add(screensPanel, BorderLayout.LINE_END);
        wholePanel2.add(wholePanel, BorderLayout.LINE_START);
        wholePanel2.add(deskScreen, BorderLayout.LINE_END);

        frame.add(wholePanel2);

        //Frame set-up and Initializing
        JFrame.setDefaultLookAndFeelDecorated(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();
        frame.setVisible(true);
        newImageRecieved.runCheck();
    }

    public static void repaintButtonPanel()
    {
        bottomPanel.removeAll();
        bottomPanel.setPreferredSize(new Dimension(1440, 200));
        buttonPanel = updateButtonPanel.updateButtonPanel(mostRecent);
        buttonPanel.setPreferredSize(new Dimension(1120, 200));
        cornerPanel.add(currentNumPanel);
        bottomPanel.add(buttonPanel);
        bottomPanel.add(cornerPanel);
        menuPanel.add(bottomPanel, BorderLayout.PAGE_END);
        frame.validate();
    }

        public static void repaintScreens()
    {
        wholePanel.remove(screensPanel);
        screen1Panel.removeAll();
        screen1Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent);
        screen2Panel.removeAll();
        screen2Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent - 1);
        screen3Panel.removeAll();
        screen3Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent - 2);
        screen4Panel.removeAll();
        screen4Panel = extraScreenPanel.extraScreenPanel(piPhoto.mostRecent - 3);
        screenPanel12.add(screen1Panel, BorderLayout.LINE_START);
        screenPanel12.add(screen2Panel, BorderLayout.LINE_END);
        screenPanel123.add(screenPanel12, BorderLayout.LINE_START);
        screenPanel123.add(screen3Panel, BorderLayout.LINE_END);
        screenPanel1234.add(screenPanel123, BorderLayout.LINE_START);
        screenPanel1234.add(screen4Panel, BorderLayout.LINE_END);
        screensPanel.add(screenPanel1234, BorderLayout.LINE_END);
        wholePanel.add(menuPanel, BorderLayout.LINE_START);
        wholePanel.add(screensPanel, BorderLayout.LINE_END);
        frame.validate();
    }



} 

检查新图像是否已添加到文件中的部分

    public class newImageRecieved {
static int count = 0;

public static void runCheck()
{
     int delay = 500;
     ActionListener taskPerformer = new ActionListener() {
        public void actionPerformed(ActionEvent evt) {

            newImageRecieved(piPhoto.mostRecent+1);
        }
     };
     new Timer(delay, taskPerformer).start();
}

    public static void newImageRecieved(int picNum)
    {

            String url[] = new String[5000];
            String part1;
        url[0] = "C:/PiPhotoPic/pic16.jpg";
        for(Integer i=1;i<5000;i++){
            if(i<10){part1 = "C:/temp/new0000000";}
            else if(i<100){part1 = "C:/temp/new000000";}
            else if(i<1000){part1 = "C:/temp/new00000";}
            else {part1 = "C:/temp/new00000";}
            String num = Integer.toString(i);
            url[i]= part1 + num + ".jpg";
        }
        if(picNum<0){picNum=0;}
        String ref = url[picNum];
            piPhoto.frame.validate();
            boolean exists = (new File(ref)).exists();
            if(exists == true)
            {
                while (exists == true) 
                {
                    piPhoto.updateMostRecent(picNum);
                    ref = url[picNum + 1];
                    picNum = picNum + 1;
                    exists = (new File(ref)).exists();

                }

                piPhoto.updateMostRecent(picNum-1);
                piPhoto.repaintButtonPanel();
                piPhoto.repaintScreens();
                count=0;
            }
        //  }
    }

}
4

3 回答 3

1

您可以尝试使用内存分析器,例如YourKit

于 2009-08-09T19:06:04.500 回答
1

今天解决了。原来我没有从旧方法中删除图像面板,所以当我重新粉刷它们时,我正在对旧的进行绘画,而旧的仍然存在。所以我只需要为所有正在更新的面板添加 removeAll() 并且程序运行良好而没有堆堆栈错误。

于 2009-08-11T00:50:18.987 回答
0

好吧,您正在创建一个包含 5000 个字符串的数组并开始填充其中的大部分。

于 2009-08-09T19:09:05.383 回答