Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Програма ест память


Автор: zhail 18.12.2008, 18:16
Доброе время суток.

У меня такая проблема:

есть прога, которая конектится к БД через JDBC. Выглядит это так: находим в таблице строку, два раза кликаем - открывается окно JDialog с подробной информацией по выбранному объекту интерфейс написан на Swing.

И получается такая штука: открыли объект в окне, закрыли открыли следующий, следующий, .... , и при этом программа при каждом открытии занимает на полтора метра больше, ну и понятно, если при старте ей нужно 25М то после нескольких десятков открытий - кричит что памяти не хватает.

С чего лучше начать искать? Что проверить? 
А то перезапускать прогу через 20-30 мин :(

Автор: SaSho 19.12.2008, 10:01
Доброе.
Профилировать, видимо, не пробовали.
"Пальцем в небо" можно предположить следующее: при открытии каждого окна JDialog создаётся новый диалог, а при закрытии память не очищается (не установлено setDefaultCloseOperation(DISPOSE_ON_CLOSE)); открытие коннекта к БД - ресурсоёмкая операция, пул используется?

Автор: zhail 19.12.2008, 10:50
Цитата(SaSho @ 19.12.2008,  10:01)
"Пальцем в небо" можно предположить следующее: при открытии каждого окна JDialog создаётся новый диалог, а при закрытии память не очищается (не установлено setDefaultCloseOperation(DISPOSE_ON_CLOSE))

Попробовал - помогло :) 
я думал, что вызова myJDialog.dispose() хватит.

Теперь программа растет не на 1,5мб в памяти, а на 300кб.

Попробую плз еще раз пальцем в небо :)

Про конект к БД, деляю так:
Код

public class DB {
    private java.sql.ResultSet resultSet;

    private java.sql.Statement statement;

    private java.sql.Connection connection;
        public boolean connect(String uName, String userPass) {
        userName = uName;
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            String url = "jdbc:mysql://192.168.10.2/myDB";

            try {
                connection = DriverManager.getConnection(url, userName,
                        userPass);
                java.sql.ResultSet rsid = select("SELECT idemployee FROM employee WHERE associateName = '"+userName+"'");
                rsid.next();
                userid = rsid.getInt("idemployee");
                System.out.println("id="+userid);
                return true;
            } catch (SQLException e) {
                e.printStackTrace();
                return false;
            }

        } catch (ClassNotFoundException e1) {
            JOptionPane.showMessageDialog(new JFrame(), "Имя пользователя или пароль не приняты" ,"Ошибка", JOptionPane.ERROR_MESSAGE);
            e1.printStackTrace();
            return false;
        }
    }

        public java.sql.ResultSet select(String qery) {
        try {
            String qer = qery;
            System.out.println(qer);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(qer);
            return resultSet;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
...
}

Автор: SaSho 22.12.2008, 11:08
Пули соединений используй. Например, http://commons.apache.org/dbcp/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)