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

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());
}
}