2009-08-09 18 views
1

würde jemand Geist einen Blick auf diese Bit-Code mit und sehen, ob es ein Speicherleck in ihnen ist, ist es nicht übermäßig groß sein würde, aber mein Programm stürzt immer wieder ab nach einer Weile des Laufens und ich weiß nicht, wie man viualvm benutzt, obwohl ich seit einigen Tagen darüber lese und nicht die geringste Ahnung habe, wonach ich in den Heap-Dumps und so weiter suche. Danke für Ihre Hilfe, ps ich weiß, dass ich viel Code muchg gebucht haben, aber ich weiß nicht, was sonst noch so zu tun, dass Sie hoffentlich kann sehen, wo das Problem für mich entsteht. Wenn es hilft, kann ich dir das volle Programm mailen, um es anzuschauen. Vielen Dank für jede Hilfe, die Sie geben können.HEAPSPACE FEHLER: kann nicht herausfinden, was den Fehler verursacht

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


} 

Ein weiterer Teil des Verfahrens

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



} 

der Teil, wenn neue Bilder überprüft, noch einen Speicher-Profiler versuchen, wie YourKit könnten Sie

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

was ist der Fehler, den Sie bekommen? – akf

+0

java.lang.OutOfMemoryError: Java-Heap-Speicher – pie154

+0

Mit dem aktuellen Setup, das ich für das Imagepanel habe, wäre mir jemand beim Schreiben einer setImage-Methode behilflich, so dass ich das Image einfach ändern kann, anstatt das ganze Panel jedes Mal neu erstellen zu müssen Ich glaube, das oder etwas in Bezug auf die JImagePanel-Methode verursacht das Problem. – pie154

Antwort

1

es heute gelöst. Es stellte sich heraus, dass ich die Bildtafeln nicht von der alten Methode entfernte, und dass ich, wenn ich sie neu strich, über die alten malte und die alten immer noch da waren. Also musste ich nur removeAll() für alle Panels hinzufügen, die aktualisiert wurden und das Programm lief ohne Heapstack-Fehler.

1

in die Datei hinzugefügt werden

+0

PS - Ich hat versucht, alle aktuell Open Source und kommerziellen Profilometer ca. 4 Wochen vor und fand YourKit das Beste zu sein, aber es gibt andere, auch dort aus. YourKit hat eine kostenlose Testversion. –

0

Nun, Sie sind eine Reihe von 5000-Strings zu schaffen und beginnen die meisten von ihnen zu füllen.

+0

würde dies viel Speicher aufnehmen? Wird das Array von Strings auch einmal angezeigt, wenn das Oszilloskop geschlossen ist? verschwinden statisch dieselben nicht-statischen Variablen? – pie154

+0

Es gibt keine Garantie, dass der GC wirkt. Selbst wenn Sie den GC explizit bitten, "jetzt" auszuführen, ist das nur eine Anfrage. Garbage Collection wird stattfinden, wenn die JVM denkt, dass es Zeit zum Sammeln ist. –

+0

Ich meinte, wenn die Methode, die eine statische Variable erzeugt, endet, wird die statische Variable für GC verfügbar sein oder bleibt sie für die Länge des Programms, da es eine statische Variable ist? – pie154