Консумиране на пространство в Java heap с 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