Hibernate - Поиск - пространство кучи Java - PullRequest
1 голос
/ 16 мая 2011

У меня проблема с пространством кучи Java в hibernate, так как я добавил модификацию в код mi.Программа загружает информацию из текстового файла (2 ГБ)

BufferedReader input = new BufferedReader(new FileReader(file));

while (line.compareTo(EOF) != 0) {
    //Load of infoObject, lots of parse information from the text file
    //Read lines of text using: line = input.readLine();

    getSession().save(infoObject);

    counter++;

    if (counter % 100 == 0) {
        getSession().flush();
        System.gc();
    }
}

Это прекрасно работает, теперь, если инфо-объект уже существует в моей БД, мне нужно обновить запись, я использую это:

BufferedReader input = new BufferedReader(new FileReader(file));

while (line.compareTo(EOF) != 0) {
    //Load of infoObject

    iObject infoObject_tmp = new iObject();
    infoObject_tmp.setNumAccount(numAccount);
    infoObject_tmp.setCloseDate(new Date("02/24/2011"));
    iObject infoObject_search = (iObject) getSession().load(iObject.class, infoObject_tmp);

    if (infoObject_search !=null){
        getSession().update(infoObject);
    }else{
        getSession().save(infoObject);
    }
    counter++;

    if (counter % 100 == 0) {
        getSession().flush();
        System.gc();
    }
}

FreeMemory:

  • Реестр 1: 750283136.
  • Реестр 10000: 648229608.
  • Реестр 50000: 411171048.
  • Реестр 100000: пространство кучи Java.

Как решить проблему с пространством кучи Java?Я знаю, что проблема в том, когда я проверяю, существует ли iObject или нет.

Ответы [ 3 ]

3 голосов
/ 16 мая 2011

вам нужно flush(), за которым следует clear(). flush() только отправляет все ожидающие обновления в базу данных. clear() удаляет объекты из сеанса. Вы должны быть осторожны с clear(), потому что любой другой код, который имеет ссылку на объект, который находился в сеансе, теперь имеет «отдельный» объект.

1 голос
/ 16 мая 2011

Трудно сказать, что именно происходит, не видя больше вашего кода.Это также немного сбивает с толку, так как ваш BufferedReader, похоже, не используется.

Тем не менее, одна возможность, учитывая то, что, по вашему мнению, вы делаете, заключается в том, что где-то вы вызываете substring для некоторого текставвод и сохранение ссылки на объект String, который возвращается в результате.Например, вы можете делать что-то вроде этого:

List<String> allMySubstrings = new ArrayList<String>();
while((line = input.readLine()) != null){
  String mySubstring = line.subString(40, 42);
  // mySubstring still has a reference to the whole character array from line
  allMySubstrings.add(mySubstring);
}

Тогда вы можете подумать, что у вас будут только ссылки на allMySubstrings, а не на каждый line, который был прочитан.Однако из-за способа реализации subString результирующий объект String будет иметь ссылку на весь исходный массив символов из line, а не только на соответствующую подстроку.Сборка мусора не произойдет, как вы могли ожидать в результате

Если вы делаете это, вы можете обойти это, создав новый String object:

List<String> allMySubstrings = new ArrayList<String>();
while((line = input.readLine()) != null){
  String mySubstring = new String(line.subString(40, 42));
  allMySubstrings.add(mySubstring);
}

Обратите внимание, что этоможет происходить, даже если вы не явно вызываете subString, так как общие методы, такие как split, могут быть ответными.

0 голосов
/ 16 мая 2011

Вы объявляете BufferedReader input, но, кажется, вы никогда не используете его.Может ли быть так, что объект line, на который вы ссылаетесь в цикле while, получает доступ к базовому File небуферизованным способом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...