Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.gui > #625

Re: Memory Leak in swing

From "steve" <steve@THRWHITE.remove-dii-this>
Subject Re: Memory Leak in swing
Message-ID <eo2pkb02n58@news2.newsguy.com> (permalink)
Newsgroups comp.lang.java.gui
References <1168423839.306143.47480@77g2000hsv.googlegroups.com>
Date 2011-04-27 15:28 +0000
Organization TDS.net

Show all headers | View raw


  To: comp.lang.java.gui
On Wed, 10 Jan 2007 18:10:39 +0800, cakmak wrote
(in article <1168423839.306143.47480@77g2000hsv.googlegroups.com>):

> I stripped-down my code, this also gathers surviving objects.
> Application containing this code could not live long. (A thread wait of
> 1 sec. also does not help.) sorry for the long posting, but it is
> really despairing!
> 
> 
> public class LeakCheck {
>     private int counter=0;
>     private final String randomquery = "SELECT TOP 4 T00801PersonNr AS
> PersonNr,             T00801PersonID AS PersonID, T00801Nachname AS
> Nachname,  T00801Vorname AS Vorname FROM DBA.T00801Person ORDER BY
> RAND()";
> 
>     private class Person extends Object {
>         private javax.swing.ImageIcon icon;
>         private String number;
>         protected void finalize() throws Throwable {
>             if(icon!=null){
>                 icon.getImage().flush();
>                 icon = null;
>             }
>             super.finalize();
>         }
>     }
>     private ArrayList<Person> personList = new ArrayList<Person>();
> 
>     protected class RefreshTask extends TimerTask {
>         @Override
>         public void run() {
>             random();
>         }
>     }
>     public void go(){
>         Timer updateTimer = new Timer("Refresh Task");
>         updateTimer.schedule(new
> RefreshTask(),0,2000);//instance,delay,interval
>     }
>     private Image LoadImageFromDB(String personnr){
>         Image img = null;
>         String filename = personnr + ".jpg";
>         Connection con =
> DbInterface.getinstance().getEtrainerDBConnection();
>         Statement stmt;
>         ResultSet rs;
>         try {
>             stmt = con.createStatement();
>             String query =
> Resources.getInstance().getDbProperties().getProperty("selectPersonImage");
>             query = String.format(query, filename);
>             rs=stmt.executeQuery(query);
>             if(rs.next()){
>                 int len=rs.getInt(2);
>                 byte [] b=new byte[len];
>                 InputStream in = rs.getBinaryStream(3);
>                 try {
>                     in.read(b);
>                     in.close();
>                     img=Toolkit.getDefaultToolkit().createImage(b);
>                 } catch (IOException e) {
>                     e.printStackTrace();
>                 }
>             }
>             rs.close();
>             stmt.close();
> 
>         } catch (SQLException e) {
>             e.printStackTrace();
>         }
>         return img;
>     }
>     public void random(){
>         java.sql.Connection con =
> DbInterface.getinstance().getSybaseDBConnection();
>         try {
>             if(con!=null && !con.isClosed()){
>                 java.sql.Statement stmt=null;
>                 try {
>                     stmt = con.createStatement();
>                     java.sql.ResultSet rs =
> stmt.executeQuery(randomquery);
>                     while(rs.next()){
>                         Person person = new Person();
>                         person.number = rs.getString("PersonNr");
>                         Image img = LoadImageFromDB(person.number);
>                         if(img !=null){
>                             ImageIcon ico = new ImageIcon(img);
>                             person.icon = ico;
>                         }
>                         personList.add(person);
>                         System.out.println("Container size: " +
> personList.size());
>                         counter++;
>                     }
>                     if(counter%20 == 0){
>                         personList.clear();
>                         System.gc();//no need, but I force for this
> example
>                         System.out.println("Container cleared, size: "
> + personList.size());
>                     }
>                     rs.close();
>                     stmt.close();
>                 } catch (SQLException ex) {
>                     ex.printStackTrace();
>                 }
>             }
>         } catch (SQLException ex) {
>             ex.printStackTrace();
>         }
>     }
>     public static void main(String[] args) {
>         LeakCheck leakCheck = new LeakCheck();
>         leakCheck.go();
>     }
> }
> 

The only thing I can see is that you keep opening  connections "con" inside 
your  random(), which is inside your timer task.

I.E you fire your timer, do the random(), which opens your connection.
Then you get your picture, closing:
 rs, in & stmt
 but you do not close the "con" before exiting.
then you re-fire your timer & reopen a connection.

if it is anything like the oracle drivers, then that is always good for a 
laugh & memory leaks.



in reality you should open your "con" outside,  and keep re-using the 
connection until it is finished then you should  close it.

also if your database is a bit slow, you could well be re-entering the code, 
without it being syncronised.

---
 * Synchronet * The Whitehouse BBS --- whitehouse.hulds.com --- check it out free usenet!
--- Synchronet 3.15a-Win32 NewsLink 1.92
Time Warp of the Future BBS - telnet://time.synchro.net:24

Back to comp.lang.java.gui | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Memory Leak in swing appl "cakmak" <cakmak@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
  Re: Memory Leak in swing "Andrew Thompson" <andrew.thompson@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
    Re: Memory Leak in swing "cakmak" <cakmak@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
      Re: Memory Leak in swing "Andrew Thompson" <andrew.thompson@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
  Re: Memory Leak in swing "cakmak" <cakmak@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
    Re: Memory Leak in swing "cakmak" <cakmak@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
      Re: Memory Leak in swing "steve" <steve@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
        Re: Memory Leak in swing "cakmak" <cakmak@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
          Re: Memory Leak in swing "steve" <steve@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
      Re: Memory Leak in swing "Andrew Thompson" <andrew.thompson@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000
      Re: Memory Leak in swing "Andrew Thompson" <andrew.thompson@THRWHITE.remove-dii-this> - 2011-04-27 15:28 +0000

csiph-web