У меня есть функция, которая работает каждый час на сервере websphere.Настраиваемая память увеличивается во время процесса свопинга
Вскоре функция считывает данные из базы данных и свопит данные со старой. До нового вызова этой функции он хранит данные в памяти для быстрого ответа в онлайн-запросах.
Моя проблема заключается в том, что, как обычно, в начале процесса свопинга моя куча увеличивает скорость дублирования данных, поэтому конец процесса свопинга я освободил все временные переменные, и моя куча уменьшается. Таким образом, использование памяти перед процессом подкачки и использование памяти после процесса свопинга одинаковы.
Но собственная память ((собственная память библиотеки Java) всегда увеличивается, она не уменьшается в конце процесса/функции свопинга или когда я освобождаю все временные переменные. Я не могу найти причину этого.
Вот моя функция
private void PopulateTL(String projectName) throws Exception {
// Setting old models
Hashtable<String, PreparedStatement> scoringFormulaMapCurrent = new Hashtable<String, PreparedStatement>();
Hashtable<String, RSP_TL_Model> calibrationMapCurrent = new Hashtable<String, RSP_TL_Model>();
Hashtable<String, PreparedStatement> scoringFormulaMapOld = scoringFormulaMapTL;
Hashtable<String, RSP_TL_Model> calibrationMapOld = calibrationMapTL;
// Getting new models
String orgDbSource = masterConfigXML.getElement("Logging",
"dbSource");
String orgSql = masterConfigXML.getElement("orgSQL", "select"
+ projectName);
Context ctx = new InitialContext();
DataSource dataSource = (DataSource) ctx.lookup(orgDbSource);
Connection connorg = dataSource.getConnection();
PreparedStatement prepStmtorg = connorg
.prepareStatement(orgSql);
ResultSet rsorg = prepStmtorg.executeQuery();
ArrayList<String> keys = new ArrayList<String>();
while (rsorg.next()) {
String ScoringSql = "";
double Beta1 = 1.0;
double Beta2 = 0.0;
StringBuffer str = new StringBuffer();
String strng;
BufferedReader bufferRead = new BufferedReader(
((Clob) rsorg.getClob("SQL_FORMULA"))
.getCharacterStream());
while ((strng = bufferRead.readLine()) != null)
str.append(strng);
ScoringSql = str.toString();
if ((Double) rsorg.getDouble("SLOPE") == null)
Beta1 = Integer.MAX_VALUE;
else
Beta1 = rsorg.getDouble("SLOPE");
if ((Double) rsorg.getDouble("INTERCEPT") == null)
Beta2 = Integer.MAX_VALUE;
else
Beta2 = rsorg.getDouble("INTERCEPT");
if (rsorg.getInt("SAMPLE_COUNT") < 5) {
Beta1 = 1;
Beta2 = 0;
}
String key = String.format("%s-%s-%s-%s",
rsorg.getObject("FLAG_VADE_NEW").toString(), rsorg
.getString("SPLIT"), rsorg.getObject("BALANCE")
.toString(), rsorg.getString("CHANNEL"));
keys.add(key);
if (projectName.equals("RSP_TL")) {
PreparedStatement psFormula = inMemoryConn
.prepareStatement(regulateScoringFormula(ScoringSql,
projectName));
scoringFormulaMapCurrent.put(key, psFormula);
calibrationMapCurrent.put(key, new RSP_TL_Model(Beta1, Beta2));
}
}
if (scoringFormulaMapCurrent.size() == 0) {
throw new Exception(
"RSPSERVER: "
+ projectName
+ "refresh failed. Returned zero records from formula table.");
} else {
// set global models from current models
scoringFormulaMapTL = scoringFormulaMapCurrent;
calibrationMapTL = calibrationMapCurrent;
System.out.println("RSPSERVER: " + projectName
+ " Refresh completed..." + "Size of Hashtable: "
+ scoringFormulaMapTL.size());
//close old models' preparedStatements
for (int i = 0; i < keys.size(); i++) {
if (scoringFormulaMapOld.get(keys.get(i)) != null) {
((PreparedStatement) scoringFormulaMapOld.get(keys.get(i)))
.close();
calibrationMapOld.remove(keys.get(i));
}
}
// clear old models' hash table
scoringFormulaMapOld.clear();
// deallocate current models
scoringFormulaMapCurrent = null;
calibrationMapCurrent = null;
prepStmtOrganon.close();
rsorg.close();
connorg.close();
}
}
родной памяти увеличивается каждый час:
- версия JDBC: 10.2.0.1.0
- оракул версия: Oracle 11g 11,1
- WEBSPHERE версия: 7.0.0.37
- сервер: unix redhat 5.11
Как вы узнали, что ваша «родная» память растет? Покажите некоторые доказательства. –
Я использую для этого инструмент мониторинга. Я добавил изображение в качестве доказательства. @JimGarrison – neverwinter