Утечка памяти Java, размер HEAP не уменьшается - PullRequest
0 голосов
/ 12 апреля 2020

Итак, я вырос на C ++ и у меня нет проблем с управлением памятью, даже когда я создаю программы на C ++. Но время пришло, рынок просит меня понять и выучить Java. Хорошо, без проблем! Потратив много времени на разработку Java приложений, я продолжаю биться в голову с этим управлением памятью в Java.

Я взял одно из своих приложений и пытался понять, как сохранить небольшой размер кучи. Изображение ниже - это принт-экран из VisualVM 2.0.1. Числа представляют времена, когда я вызываю функцию CollectData(). Как видите, с номером 1 все в порядке, но когда я снова его вызываю, он увеличивается с 125MB и продолжает работать. Я не понимаю почему? (Поэтому я вставляю свой код ниже, так что, может быть, кто-то может помочь мне объяснить, что происходит).

Поэтому я попробовал в основном все, играя с операторами null и new, но безуспешно. Также я пытался играть с функцией System.gc().

VisualVM

public void CollectData() {
    /// Variables
    taBB.setText("");
    Connection con;   
    String tb_name_hours = "table_name";
    String tb_name_minutes = "table_name";
    String db_name = "database_name";

    List<TickerIntervalData> data_set_mins = new ArrayList<TickerIntervalData>();
    List<TickerIntervalData> data_set_hours = new ArrayList<TickerIntervalData>();
    DecimalFormat dec = new DecimalFormat("#0.0000");
    DecimalFormat dec2 = new DecimalFormat("#0.00000000");


    ///
    try {
        /// Connect
        String url = "jdbc:mysql://" + tfIP.getText() + ":" + tfPort.getText();
        Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
        DriverManager.setLoginTimeout(2);     
        con = DriverManager.getConnection(url, tfUser.getText(), String.valueOf(tfPassword.getPassword()));     


        // Use db_name
        Statement stt = con.createStatement();
        stt.execute("USE " + db_name);        


        // Get rows from hour table
        ResultSet res = stt.executeQuery("SELECT * FROM " + tb_name_hours);
        while (res.next()) {
            TickerIntervalData new_record = new TickerIntervalData();
            new_record.setOpen(res.getDouble("open"));
            new_record.setHighest(res.getDouble("highest")); 
            new_record.setLowest(res.getDouble("lowest")); 
            new_record.setClose(res.getDouble("close")); 
            new_record.setVolume(res.getDouble("volume")); 
            new_record.setBv(res.getDouble("bv")); 
            new_record.setTimestamp(res.getString("time")); 
            data_set_hours.add(new_record);
        } 


        // Get rows from minute table
        res = stt.executeQuery("SELECT * FROM " + tb_name_minutes);
        while (res.next()) {
            TickerIntervalData new_record = new TickerIntervalData();
            new_record.setOpen(res.getDouble("open"));
            new_record.setHighest(res.getDouble("highest")); 
            new_record.setLowest(res.getDouble("lowest")); 
            new_record.setClose(res.getDouble("close")); 
            new_record.setVolume(res.getDouble("volume")); 
            new_record.setBv(res.getDouble("bv")); 
            new_record.setTimestamp(res.getString("time")); 
            data_set_mins.add(new_record);
        } 


        // Free resources
        res.close();
        stt.close();
        res = null;
        stt = null;


        // 
        data_set_hours.clear();
        data_set_hours = null;
        data_set_mins.clear();
        data_set_mins = null;
    } catch (Exception e) {
        taBB.setText(e.toString());
    }
}
...