HEAP SPACE ERROR:无法弄清楚导致错误的原因

时间:2009-08-09 19:03:23

标签: java heap-memory visualvm jvisualvm

有人会介意看看这些代码并看看它们是否有内存泄漏,它不会过大但我的程序在运行一段时间后仍会崩溃而我不知道如何使用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;
            }
        //  }
    }

}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

今天解决了。事实证明我没有从旧方法中删除图像面板,因为当我重新绘制它们时,我正在绘制旧的绘图,旧的仍在那里。所以我只需要为所有正在更新的面板添加removeAll(),程序运行正常,没有堆栈错误。

答案 2 :(得分:0)

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