문제

이 코드의 코드를보고 메모리 누출이 있는지 확인하는 사람이라면 지나치게 크지 않지만 시간이 지나면 계속해서 충돌하고 사용 방법을 모르겠습니다. Viualvm이 며칠 동안 읽고 있었지만 힙 덤프에서 무엇을 찾고 있는지 가장 작은 아이디어를 얻지 못했습니다. 도움을 주셔서 감사합니다. PS 저는 Muchg 코드에 멀리 게시되었음을 알고 있지만 문제가 어디에서 발생하는지 바를 수 있도록 무엇을 해야할지 모르겠습니다. 그것이 도움이되면 전체 프로그램을 이메일로 보내면 살펴볼 수 있습니다. 도움을 주셔서 감사합니다.

  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;
            }
        //  }
    }

}
도움이 되었습니까?

해결책 2

오늘 그것을 해결했습니다. 나는 이전 방법에서 이미지 패널을 제거하지 않았다는 것이 밝혀졌습니다. Aso는 내가 그들을 다시 칠할 때 나는 오래된 것들에 그림을 그렸고 오래된 것들이 여전히 거기에 있다는 것을 알았습니다. 따라서 업데이트중인 모든 패널에 대해 removeall ()을 추가해야했으며 힙 스택 오류없이 프로그램이 정상적으로 실행되었습니다.

다른 팁

다음과 같은 메모리 프로파일 러를 시도 할 수 있습니다 Yourkit

글쎄, 당신은 5000 줄의 배열을 만들고 대부분의 줄을 채우기 시작합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top