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 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів