2009-08-09 6 views
1

Может кто-нибудь подумать над этими битами кода и посмотреть, есть ли в них утечка памяти, это не будет слишком большим, но моя программа продолжает сбой после некоторого времени работы, и я не знаю, как использовать viualvm, хотя я читал его уже несколько дней и не имею ни малейшего представления о том, что я ищу в кучих свалок и так далее. спасибо за вашу помощь, ps Я знаю, что я опубликовал далеко не много кода, но я не знаю, что еще делать, чтобы вы могли надеяться увидеть, где проблема возникает для меня. Если это поможет, я могу отправить вам по электронной почте полную программу, чтобы взглянуть на нее. Большое спасибо за любую помощь, которую вы можете дать.HEAPSPACE ERROR: не могу понять, что вызывает ошибку.

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

} 
+0

Какая ошибка вы получаете? – akf

+0

java.lang.OutOfMemoryError: Java heap space – pie154

+0

С текущей настройкой, которую я имею для панели изображений, кто-нибудь сможет мне помочь в написании метода setImage, чтобы я мог просто изменить изображение, а не создавать воссоздание всей панели каждый раз , Я думаю, что это или что-то о методе JImagePanel вызывает проблему. – pie154

ответ

1

Решено сегодня. Оказывается, я не удалял панели изображений со старого метода, так как, когда я перекрашивал их, я рисовал поверх старых, а старые остались. Поэтому мне просто нужно было добавить removeAll() для всех панелей, которые обновлялись, и программа работала нормально без ошибок в кучей архива.

1

Вы можете попробовать профайлер памяти, такие как YourKit

+0

PS - Я пробовал все текущие источники с открытым исходным кодом и коммерческие профилировщики около 4 недель назад и нашел, что YourKit является лучшим, но есть и другие. У YourKit есть бесплатная пробная версия. –

0

Ну, вы создаете массив из 5000 строк и начинаете заполнять большинство из них.

+0

это заняло бы много памяти? Также будет ли массив строк содержать GC'd в пределах области, в которой он закрыт? Неужели статика исчезает теми же нестационарными переменными? – pie154

+0

Нет гарантии, что GC будет действовать. Даже если вы попросите GC явно запустить «сейчас», это всего лишь запрос. Сбор мусора произойдет, когда JVM подумает, что пришло время собирать. –

+0

Я имел в виду, когда метод, который создает статическую переменную, заканчивается, будет ли статическая переменная доступной для GC или она останется на длине программы, так как это статическая переменная? – pie154