Потребление места в куче Java с помощью JTable char[], String и Objects

Я пытаюсь лучше понять и улучшить использование памяти в моем приложении Swing.

Существует экран, который пользователь имеет тенденцию многократно открывать каждый раз, когда ему нужно найти продукт для продажи. Этот экран показывает jtable с большим количеством продуктов, как показано на рисунке ниже.

введите здесь описание изображения

Проблема в том, что когда я продолжаю открывать и закрывать этот экран, куча памяти продолжает увеличиваться, а сборщик мусора, похоже, не работает (вероятно, потому что мои объекты не освобождаются).

Я использовал java VisualVM, чтобы проверить, какие объекты больше всего занимают место в куче, и это показано на снимке экрана ниже.

введите здесь описание изображения

Я предполагаю, что эти объекты char[] и string создаются из-за JTable.

Когда я закрываю экран, я делаю следующее

jTable1 = null;
data = null; //(arraylist where I stored the data from the database)
System.gc();

Кто-нибудь знает, что мне может не хватать? Есть ли другой способ освободить объекты, кроме установки ссылок на null?

Спасибо за помощь!

Код для структурирования данных в объект[][] для помещения в таблицу.

private Object[][] getProdutosObjects() {
        ProdutoModel pm = new ProdutoModel();
        try {
            data = pm.getAllProducts();
        } catch (DefaultException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(this, e.getMsg(), "", JOptionPane.WARNING_MESSAGE);
        }

        Object[][] matriz = new Object[data.size()][3];
        int i = 0;
        for (Object p : data) {
            matriz[i][0] = ((Object[])p)[0]; //codigodist
            matriz[i][1] = ((Object[])p)[1]; //descricao
            matriz[i][2] = ((Object[])p)[2]; //descricaodist
            i++;
        }

        return matriz;
    }

Код для создания jtable:

jTable1.setModel(new javax.swing.table.DefaultTableModel(
                getProdutosObjects(),
                new String [] {
                    "Código", "Descrição", "Descrição Distribuidor"
                }
        ){
            boolean[] canEdit = new boolean [] {
                    true, false, false
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.getSelectionModel().addListSelectionListener(new ListSelectionListener() {  
            public void valueChanged(ListSelectionEvent event) {  
                jTable1.scrollRectToVisible(jTable1.getCellRect(  
                        jTable1.getSelectedRow(), 0, true));  
            }
        });

person user2402105    schedule 01.05.2014    source источник
comment
Я не уверен, зачем вам нужно переводить с data на Object[][]. Если бы вместо этого вы использовали AbstractTableModel, вы могли бы получить более точный контроль над тем, что и как данные возвращаются моделью.   -  person MadProgrammer    schedule 01.05.2014
comment
Да.. Я думаю, что это был бы лучший выбор, чтобы выполнять меньше операций при создании JTable. Я попробовал это сейчас и создал свою собственную модель, используя непосредственно мои данные списка, но проблема остается. Он продолжает инициализировать все эти объекты char[], Strings и Integers, и они не освобождаются из памяти.   -  person user2402105    schedule 01.05.2014
comment
Вы можете использовать JVisualVM для просмотра отдельных объектов определенного типа, а затем просматривать их входящие ссылки. Это скажет вам, что поддерживает жизнь объектов.   -  person Jeffrey Bosboom    schedule 04.07.2014


Ответы (1)


Сделайте слабые или программные ссылки объектами, чтобы GC очищал ссылки после достижения определенных пороговых циклов.

person Mohan Raj    schedule 17.04.2015