Java memory leak
400 000 записів в таблиці.. в кожному рядку файлик по 3кб. треба їх витягнути з бази і записати в файлик. і це робити кожного дня.. (ппц:))
цей процес забирає дуже багато памяті і дані в памяті не очищаються після виконання цієї роботи.
private void exportTimeStampToFiles(File backupDir) throws IOException, ServiceException {
File timestampDir = new File(backupDir, "timestamp");
FileUtils.forceMkdir(timestampDir);
int limit = 10000;
for (int i = 0; ; i += limit) {
Map<String, byte[]> timestampMap = this.exportDatabaseService.exportDocumentTimestamp(Integer.valueOf(limit), Integer.valueOf(i));
for (Map.Entry<String, byte[]> entry : timestampMap.entrySet()) {
byte[] value = entry.getValue();
FileUtils.writeByteArrayToFile(new File(timestampDir, entry.getKey()), value);
}
int size = timestampMap.size();
timestampMap = null;
if (size < limit) {
break;
}
}
}
public Map<String, byte[]> exportDocumentTimestamp(Integer limit, Integer offset) throws ServiceException {
Map<String, byte[]> result = new FastMap<>();
int iName = 0;
int iTimeStamp = 1;
SW.start();
List<Object[]> objects = documentDao.exportTimestamp(limit, offset);
logger.info("get timestamp from db = {}", SW.stop());
for (Object[] doc : objects) {
String name = (String) doc[iName];
byte[] timestamp = (byte[]) doc[iTimeStamp];
result.put(name, timestamp);
}
return result;
}
public List<Object[]> exportTimestamp(Integer limit, Integer offset) {
SQLQuery sqlQuery = SessionService.session()
.createSQLQuery("SELECT name, time_stamp_response from document where time_stamp_response notnull limit :limit offset :offset");
sqlQuery.setParameter("limit", limit);
sqlQuery.setParameter("offset", offset);
sqlQuery.addScalar("name",StringType.INSTANCE);
sqlQuery.addScalar("time_stamp_response", BinaryType.INSTANCE);
return sqlQuery.list();
}
що можете порадити?
Якщо коротко то алгоритм такий.. дістаю ці данні по 10000 рядків.. запихую в мапу. передаю мапу. ітерую мапу і записую валуе в файл..
використовую апачі лібу для запису в файл.. пробував без ліби.. теж саме.
i60.tinypic.com/2w3qohe.jpg
із скріна видно що гарбедж колектор все таки очищає непотрідні дані.. але виділена память не знижується
36 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів