Memory Leak in a multi threaded java application (ImageIcon)

Discussion in 'Java' started by cakmak, Jan 10, 2007.

  1. cakmak

    cakmak Guest

    When I profile my swing application with netbeans 5.5 , I notice that
    after each periodically tidy up my image container (add,remove
    IconImage objects to a hashmap or arraylist), there gather by and by
    surviving objects. This leads to run out of memory after a while. Is
    there any other way to avoid this effect? Any ideas about "The JVM is
    notorious for caching images." I stripped-down my code, this also
    gathers surviving objects. An application containing this code could
    not live long.



    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);
    }
    private Image LoadImageFromDB(String personnr){
    Image img = null;
    String filename = personnr + ".jpg";
    Connection con = getEtrainerDBConnection();
    Statement stmt;
    ResultSet rs;
    try {
    stmt = con.createStatement();
    String query = Resources.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 = 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
    System.out.println("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();
    }
    }
     
    cakmak, Jan 10, 2007
    #1
    1. Advertising

  2. cakmak wrote:
    ...
    > ..Any ideas about "The JVM is
    > notorious for caching images."


    Note: This post is the continuation of a thread
    on c.l.j.g. that failed to reveal the underlying
    problem. Further details can be seen on the
    thread beginning with this post..
    <http://groups.google.com/groups?selm=>

    Andrew T.
     
    Andrew Thompson, Jan 10, 2007
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Rodney Edmondson
    Replies:
    11
    Views:
    657
    Jeremy
    Dec 9, 2003
  2. Luke

    ImageIcon memory sizes

    Luke, Sep 10, 2005, in forum: Java
    Replies:
    6
    Views:
    998
    Roedy Green
    Sep 10, 2005
  3. ian douglas
    Replies:
    2
    Views:
    988
    Randy Howard
    Jul 30, 2004
  4. knt
    Replies:
    2
    Views:
    487
  5. Alfonso Morra
    Replies:
    3
    Views:
    440
    Joe Seigh
    Jul 20, 2005
Loading...

Share This Page