Avatar billede martin_schou Nybegynder
30. november 2001 - 09:34 Der er 16 kommentarer og
1 løsning

\"Lukkede\" objekter?

Jeg har (igen) et problem med et memory-leak, og jeg er ærligt talt træt af at skulle rende 10.000+ linjer kode igennem en milliard million gange, for at tjekke om jeg nu har lukket hvert enkelt objekt ordentligt ned.

Nogen forslag til hvordan jeg gør det på en NEM måde (udover at gøre det fra starten, når jeg koder - det er lidt svært at lave om på, når koden er skrevet)?

Kan I evt. henvise til utilities som kan vise mig præcis hvilke objekter, der er i brug i hukommelsen lige nu, hvor de er instantieret fra og hvilket navn de er instantieret under (har prøvet HeapInspector fra http://www.geocities.com/moellep/debug/HeapInspector.html, men den kan ikke gøre de sidste to ting).
Avatar billede jakoba Nybegynder
30. november 2001 - 09:44 #1
Beklager. Der findes nok programmer der kan hjælpe lidt. men indtil videre er memoryleaks et problem vi må klare selv ved at tænke os om, og lade være med at lave programmer der lækker.
Avatar billede martin_schou Nybegynder
30. november 2001 - 09:48 #2
Aha ... du mener altså, at hvis et program lækker, så er man nødt til at starte forfra, fordi det ikke kan lade sig gøre at lukke hullet?
Avatar billede jakoba Nybegynder
30. november 2001 - 10:14 #3
Nej da. du kan også tænke efter du har skrevet programmet. Det er ofte lidt sværere, men det er muligt.
men ellers ja. De bedste programmer får man når man tænker FØR man begynder at programmere :-))
Avatar billede martin_schou Nybegynder
30. november 2001 - 10:22 #4
Det er fuldstændigt rigtigt - ganske som man slipper bedst fra ulykker, ved aldrig at blive udsat for dem. Det hjælper bare ikke en meter, når det er sket.
Avatar billede jakoba Nybegynder
30. november 2001 - 10:47 #5
Det har du helt ret i. Og så ønsker man sig en mirakelkur. Et ikon man kan trykke på til at få problemet til at forsvinde. Jeg tvivler på der findes sådan et ikon (uanset hvormange sælgere der står parat til at sælge dig et).

Men det kunne da være, så lykke til.

mvh JakobA
Avatar billede martin_schou Nybegynder
30. november 2001 - 10:58 #6
Jeg har aldrig sagt, jeg ville have en mirakkelkur - jeg spurgte efter nogle nemme måder, \"at tjekke om jeg nu har lukket hvert enkelt objekt ordentligt ned\", og nogle \"forslag til hvordan jeg gør det på en NEM måde\", så jeg slipper for \"at skulle rende 10.000+ linjer kode igennem en milliard million gange\".

Følgende kodestump er en hjælp i den retning (postes i næste indlæg fra undertegnede).
Avatar billede martin_schou Nybegynder
30. november 2001 - 11:03 #7
/* Kode Start */
package FindInLine;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class FindInLineModel extends Thread
  {
    private File                  Fil;
    private String                StringToFind;
    private String[]              FoundStrings;
    private int[]                StringsFoundInLineNumber;
   
    public FindInLineModel( String _FileName, String _StringToFind )
      {
        StringToFind              = _StringToFind;
        Fil                      = new File( _FileName );
        int længde                = (int) Fil.length();
        FoundStrings              = new String[ længde ];
        StringsFoundInLineNumber  = new int[ længde ];
        FindTextInFile();
      }
     
    public void FindTextInFile()
      {
        RandomAccessFile RAF = null;
        try
          {
            RAF = new RandomAccessFile( Fil, \"r\" );
            String TempLine;
            int index = 0;
            int AntalLinjerFundet = 0;

            while( index < Fil.length() )
              {
                TempLine = RAF.readLine();
                /**/ if( TempLine == null )
                  {
                    //Der er intet i filen.
                    break;
                  }
                else if( TempLine.indexOf( StringToFind ) > 0 )
                  {
                    StringsFoundInLineNumber[AntalLinjerFundet] = index;
                    FoundStrings[AntalLinjerFundet] = TempLine;
                    AntalLinjerFundet++;
                  }
                index++;
              }
           
            for( index = 0 ; index < AntalLinjerFundet ; index++ )
              {
                System.out.print(\"[Linje: \" );
                if( StringsFoundInLineNumber[index] < 10000 )
                  {
                    System.out.print( \"0\" );
                  }
                if( StringsFoundInLineNumber[index] < 1000 )
                  {
                    System.out.print( \"0\" );
                  }
                if( StringsFoundInLineNumber[index] < 100 )
                  {
                    System.out.print( \"0\" );
                  }
                if( StringsFoundInLineNumber[index] < 10 )
                  {
                    System.out.print( \"0\" );
                  }
                if( StringsFoundInLineNumber[index] < 1 )
                  {
                    System.out.print( \"0\" );
                  }
                System.out.print( StringsFoundInLineNumber[index] );
                System.out.println( \"] - [\"+ FoundStrings[index] +\"]\");
              }
            RAF.close();
            RAF = null;
          }
        catch( IOException e )
          {
            if( RAF != null )
              {
                try
                  {
                    RAF.close();
                    RAF = null;
                  }
                catch( IOException ex )
                  {
                    ex = null;
                  }
              }
            e.printStackTrace();
            e = null;
          }
        catch( Exception e )
          {
            if( RAF != null )
              {
                try
                  {
                    RAF.close();
                    RAF = null;
                  }
                catch( IOException ex )
                  {
                    ex = null;
                  }
              }
            e.printStackTrace();
            e = null;
          }
      }
     
    public static void main( String[] argv )
      {
        if( argv.length > 1 )
          {
            String FileName = argv[0];
            String StringToFind = argv[1];
            new FindInLineModel( FileName, StringToFind );
          }
        else
          {
            System.exit(1);
          }
      }
  }
/* Kode slut */

Køres således:

java FindInLine.FindInLineModel Z:\\fil.navn tekststreng >output.txt

Kan desværre kun finde et enkelt ord i øjeblikket; det er fint nok for mig lige nu, men hvordan får jeg den så til at kunne finde sætninger istedet for blot ord?
Avatar billede martin_schou Nybegynder
30. november 2001 - 11:16 #8
Blah ... man kan også være FOR dum:

/* Start kodestump - skal erstatte String StringToFind = argv[1]; */
String StringToFind = \"\";
            for( int index = 1 ; index < argv.length ; index++ )
              {
                StringToFind += \" \" + argv[index];
              }
/* Slut kodestump */
Avatar billede logical Nybegynder
30. november 2001 - 20:22 #9
Jeg så et program på JavaOne i år, som viste en objektgraf under afvikling af en applikation. Der så man alle objekter i spil, helt dynamisk.
MEN, jeg kan ikke huske hvem der lavede det :-(( Sorry.
Avatar billede martin_schou Nybegynder
01. december 2001 - 00:00 #10
Blah ... man kan også være FOR dum:

/* Start kodestump */
String StringToFind = argv[index];
      for( int index = 2 ; index < argv.length ; index++ )
      {
        StringToFind += \" \" + argv[index];
      }
/* Slut kodestump */

så undgår man mellemrum i starten af strengen.
Avatar billede martin_schou Nybegynder
05. december 2001 - 09:37 #11
Jeg lægger lige
Avatar billede martin_schou Nybegynder
05. december 2001 - 09:39 #12
Prøver liige den igen.

Jeg lægger lige den nuværende kode på min \"endelige\" grep-implementering; den er en god hjælp (for mig) til at finde ud af, om jeg nu også har lukke af for alle komplekse objekter. Nu også med en grafisk brugerflade :-)

Den kommer lige i tre afdelinger (model, controller, view).
Avatar billede martin_schou Nybegynder
05. december 2001 - 09:39 #13
package FindInLine;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import FindInLine.GUI.FindInLineController;

import java.util.Vector;

public class FindInLineModel extends Thread
  {
    //private File                  Fil;
    //private String                StringToFind;
    private String[]                FoundStrings;
    private int[]                  StringsFoundInLineNumber;
    private FindInLineController  Controller;
   
    public FindInLineModel()
      {
        Controller = new FindInLineController( this );
      }
     
    public FindInLineModel( String FileName, String StringToFind )
      {
        Controller = new FindInLineController( this, FileName, StringToFind );
      }
     
    public Object[] FindTextInFile( String Fil, String StringToFind )
      {
        RandomAccessFile RAF = null;
        try
          {
            RAF = new RandomAccessFile( Fil, \"r\" );
            String TempLine;
            int index = 0;
            int AntalLinjerFundet = 0;
            long Fillængde = RAF.length();
            StringsFoundInLineNumber = new int[(int) Fillængde];
            FoundStrings = new String[(int) Fillængde];

            while( index < Fillængde )
              {
                TempLine = RAF.readLine();
                /**/ if( TempLine == null )
                  {
                    //Der er intet i filen.
                    break;
                  }
                else if( TempLine.indexOf( StringToFind ) > 0 )
                  {
                    StringsFoundInLineNumber[AntalLinjerFundet] = index+1;
                    FoundStrings[AntalLinjerFundet] = TempLine ;
                    AntalLinjerFundet++;
                  }
                index++;
              }
            String[] stringTemp = new String[AntalLinjerFundet];
            int[] intTemp = new int[AntalLinjerFundet];
           
            for( index = 0 ; index < AntalLinjerFundet ; index++ )
              {
                stringTemp[index] = FoundStrings[index];
                intTemp[index] = StringsFoundInLineNumber[index];
              }
            FoundStrings = stringTemp;
            StringsFoundInLineNumber = intTemp;
            RAF.close();
            RAF = null;
            return new Object[]{FoundStrings, StringsFoundInLineNumber};
          }
        catch( IOException e )
          {
            if( RAF != null )
              {
                try
                  {
                    RAF.close();
                    RAF = null;
                  }
                catch( IOException ex )
                  {
                    ex.printStackTrace();
                    ex = null;
                  }
              }
            e.printStackTrace();
            e = null;
          }
        catch( Exception e )
          {
            if( RAF != null )
              {
                try
                  {
                    RAF.close();
                    RAF = null;
                  }
                catch( IOException ex )
                  {
                    ex.printStackTrace();
                    ex = null;
                  }
              }
            e.printStackTrace();
            e = null;
          }
        return null;
      }
     
    public static void main( String[] argv )
      {
        if( argv.length > 1 )
          {
            String FileName = argv[0];
            String StringToFind = argv[1];
            for( int index = 2 ; index < argv.length ; index++ )
              {
                StringToFind += \" \" + argv[index];
              }
            System.out.println( StringToFind );
            new FindInLineModel( FileName, StringToFind );
          }
        else
          {
            new FindInLineModel();
          }       
      }
  }
Avatar billede martin_schou Nybegynder
05. december 2001 - 09:40 #14
package FindInLine.GUI;

import FindInLine.FindInLineModel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.util.Vector;

public class FindInLineController implements ActionListener
  {
    private FindInLineModel    Model;
    private FindInLineGUI      GUI;
   
    public FindInLineController( FindInLineModel _Model )
      {
        Model = _Model;
        GUI = new FindInLineGUI( this );
      }
     
    public FindInLineController( FindInLineModel _Model, String FileName, String Søgetekst )
      {
        Model = _Model;
        GUI = new FindInLineGUI( this, FileName, Søgetekst );
        actionPerformed( new ActionEvent( this, 0, \"\" ) );
      }
     
    public void actionPerformed(ActionEvent e)
      {
        Object[] temp = null;
        try{
        temp = Model.FindTextInFile( GUI.getFileName(), GUI.getSøgetekst() );
        }
        catch( Exception ex )
        {
          ex.printStackTrace();
          System.exit(1);
        }
        GUI.Clear();
        String[] FoundString = (String[]) temp[0];
        int[]    FoundInLine = (int[]) temp[1];
       
        for( int index = 0 ; index < FoundString.length ; index++ )
          {
            String LineNumber = \"\";
            if( FoundInLine[index] < 10000 )
            { LineNumber+=\"0\";}
            if( FoundInLine[index] < 1000 )
            { LineNumber+=\"0\";}
            if( FoundInLine[index] < 100 )
            { LineNumber+=\"0\";}
            if( FoundInLine[index] < 10 )
            { LineNumber+=\"0\";}
            if( FoundInLine[index] < 1 )
            { LineNumber+=\"0\";}
            LineNumber+=FoundInLine[index];
            GUI.AddLine( FoundString[index], LineNumber );
          }
        GUI.setTitle( FoundString.length + \" occurences of \\\"\" + GUI.getSøgetekst() + \"\\\" in \" + GUI.getFileName() );
        FoundString = null;
        FoundInLine = null;
        temp[0] = null;
        temp[1] = null;
        temp = null;
      }
  }
Avatar billede martin_schou Nybegynder
05. december 2001 - 09:40 #15
/*
* FindInLineGUI.java
*
* Created on 5. december 2001, 04:38
*/

package FindInLine.GUI;

//import java.awt.ActionListener;

/**
*
* @author  MS
*/
public class FindInLineGUI extends javax.swing.JFrame {

  private FindInLineController Controller;
 
  /** Creates new form FindInLineGUI */
    public FindInLineGUI( FindInLineController _Controller )
    {
        Controller = _Controller;
        initComponents();
        ÅbnButton.addActionListener( _Controller );
        setSize( 640, 480 );
        setLocation( 100, 100 );
        setVisible(true);
    }
   
    public FindInLineGUI( FindInLineController _Controller, String FileName, String Søgetekst )
      {
        Controller = _Controller;
        initComponents();
        FilenavnTextField.setText(FileName);
        SøgetekstTextField.setText(Søgetekst);
        ÅbnButton.addActionListener( _Controller );
        setSize( 640, 480 );
        setLocation( 100, 100 );       
        setVisible(true);
      }

    /** This method is called from within the constructor to
    * initialize the form.
    * WARNING: Do NOT modify this code. The content of this method is
    * always regenerated by the Form Editor.
    */
    private void initComponents()//GEN-BEGIN:initComponents
    {
      SouthPanel = new java.awt.Panel();
      FilenavnTextField = new javax.swing.JTextField();
      ÅbnButton = new javax.swing.JButton();
      SøgetekstTextField = new javax.swing.JTextField();
      OutputTextArea = new java.awt.TextArea();
     
      addWindowListener(new java.awt.event.WindowAdapter()
      {
        public void windowClosing(java.awt.event.WindowEvent evt)
        {
          exitForm(evt);
        }
      });
     
      SouthPanel.setLayout(new java.awt.BorderLayout());
     
      FilenavnTextField.setText(\"Filnavn\");
      FilenavnTextField.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
          FilenavnTextFieldActionPerformed(evt);
        }
      });
     
      SouthPanel.add(FilenavnTextField, java.awt.BorderLayout.CENTER);
     
      ÅbnButton.setText(\"\\u00c5bn\");
      SouthPanel.add(ÅbnButton, java.awt.BorderLayout.EAST);
     
      SøgetekstTextField.setText(\"S\\u00f8getekst\");
      SøgetekstTextField.addActionListener(new java.awt.event.ActionListener()
      {
        public void actionPerformed(java.awt.event.ActionEvent evt)
        {
          SøgetekstTextFieldActionPerformed(evt);
        }
      });
     
      SouthPanel.add(SøgetekstTextField, java.awt.BorderLayout.NORTH);
     
      getContentPane().add(SouthPanel, java.awt.BorderLayout.SOUTH);
     
      getContentPane().add(OutputTextArea, java.awt.BorderLayout.CENTER);
     
      pack();
    }//GEN-END:initComponents

    private void SøgetekstTextFieldActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_SøgetekstTextFieldActionPerformed
    {//GEN-HEADEREND:event_SøgetekstTextFieldActionPerformed
      // Add your handling code here:
    }//GEN-LAST:event_SøgetekstTextFieldActionPerformed

    private void FilenavnTextFieldActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_FilenavnTextFieldActionPerformed
    {//GEN-HEADEREND:event_FilenavnTextFieldActionPerformed
      // Add your handling code here:
    }//GEN-LAST:event_FilenavnTextFieldActionPerformed

    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
        System.exit(0);
    }//GEN-LAST:event_exitForm


    void AddLine( String line, String number )
    {
      OutputTextArea.append( \"[\" + number + \"] | \" + line + \"\\r\\n\" );
      //LineTextArea.append( number + \"\\r\\n\" );
    }   

    void Clear()
    {
      OutputTextArea.setText(\"\");
      //LineTextArea.setText(\"\");
    }
   
    String getFileName()
    {
      return FilenavnTextField.getText();
    }
   
    String getSøgetekst()
    {
      return SøgetekstTextField.getText();
    }
   
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private java.awt.Panel SouthPanel;
    private javax.swing.JTextField FilenavnTextField;
    private javax.swing.JButton ÅbnButton;
    private javax.swing.JTextField SøgetekstTextField;
    private java.awt.TextArea OutputTextArea;
    // End of variables declaration//GEN-END:variables

}
Avatar billede martin_schou Nybegynder
05. december 2001 - 09:42 #16
Lidt rodet, og det ville faktisk ikke undre mig, om der var et par memory-leaks eller 10; desuden kan den sikkert optimeres en del - men den virker, og det burde vel ikke være svært at tilføje ny funktionalitet til lortet.

Anyways - det er det mest brugbare svar indtil videre, så jeg lukker programmet her.
Avatar billede martin_schou Nybegynder
05. december 2001 - 09:46 #17
Hmm ... burde vist lige have fjernet alle udkommenterede linjer. D\'oh!

Og så staver jeg vist ad lort.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester