2009-08-09 10 views
1

Quelqu'un pourrait-il se pencher sur ces bits de code et voir s'il y a une fuite de mémoire en eux, il ne va pas être trop grand, mais mon programme se bloque après un moment de course et je ne sais pas comment utiliser viualvm même si j'ai lu dessus depuis plusieurs jours maintenant et n'ai pas la moindre idée de ce que je cherche dans les décharges de tas et ainsi de suite. merci pour votre aide, ps je sais que j'ai posté loin à code muchg mais je ne sais pas quoi d'autre à faire pour que vous puissiez voir où le problème se pose pour moi. Si cela vous aide, je peux vous envoyer un e-mail avec le programme complet. Merci beaucoup pour toute aide que vous pouvez donner.ERREUR HEAPSPACE: ne peut pas comprendre ce qui cause l'erreur

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


} 

Une autre partie de la méthode

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(); 
    } 



} 

la partie qui vérifie si de nouvelles images sont ajoutées au fichier encore

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

Quelle est l'erreur que vous obtenez? – akf

+0

java.lang.OutOfMemoryError: Java heap space – pie154

+0

Avec la configuration actuelle que j'ai pour l'imagepanel, quelqu'un pourrait-il m'aider à écrire une méthode setImage de façon à pouvoir changer l'image plutôt que d'avoir à recréer le tableau entier à chaque fois , Je pense que cela ou quelque chose à propos de la méthode JImagePanel est à l'origine du problème. – pie154

Répondre

1

Résolu aujourd'hui. Il s'avère que je n'ai pas retiré les panneaux d'image de l'ancienne méthode, de sorte que lorsque je les repeignais, je peignais sur les anciens et les anciens étaient toujours là. Donc, j'ai juste besoin d'ajouter removeAll() pour tous les panneaux qui étaient en cours de mise à jour et le programme s'est bien passé sans erreurs de tas.

1

Vous pouvez essayer un profileur de mémoire tels que YourKit

+0

PS - J'ai essayé tous les profileurs open source et commerciaux actuels il y a environ 4 semaines et j'ai trouvé que YourKit était le meilleur, mais il y en a d'autres aussi. YourKit a un essai gratuit. –

0

Eh bien, vous créez un tableau de 5000 chaînes et commencez à remplir la plupart d'entre elles.

+0

cela prendrait-il beaucoup de mémoire? Est-ce que le tableau de chaînes sera GC'd sur la portée contenant il est fermé? les statistiques disparaissent-elles de la même façon qu'une variable non statique? – pie154

+0

Il n'y a absolument aucune garantie quand le GC agira. Même si vous demandez explicitement au GC de lancer "maintenant", ce n'est qu'une demande. Garbage Collection se produira lorsque la JVM pense qu'il est temps de collecter. –

+0

Je voulais dire que lorsque la méthode qui crée une variable statique se termine, la variable statique sera-t-elle disponible pour GC ou restera-t-elle pendant la durée du programme étant donné qu'il s'agit d'une variable statique? – pie154

Questions connexes