Java Excel POI zatrzymuje się po wielokrotnym wykonaniu przez kwarc

Chciałbym mieć na ten temat kilka spostrzeżeń.

Mam program, który odczytuje i zapisuje z bazy danych do pliku programu Excel. Jego egzekucja opiera się na zegarze przy użyciu kwarcowego api i uruchamiana jest w każdy wtorek tygodnia. Problem polega na tym, że kiedy przetestowałem go, planując wykonanie zadania co godzinę, program nagle zatrzymuje się po kilku wykonaniach wewnątrz procesu zapisywania pliku programu Excel. Oto mój zapis do kodu programu Excel.

try {
        FileInputStream file = new FileInputStream(excelFile);
        POIFSFileSystem myFileSystem = new POIFSFileSystem(file);
        HSSFWorkbook workbook = new HSSFWorkbook(myFileSystem);
        HSSFSheet worksheet = workbook.getSheetAt(0);
        this.cellStyle00 = workbook.createCellStyle();
        HSSFDataFormat df = workbook.createDataFormat();
        this.cellStyle00.setDataFormat(df.getFormat("00"));

for(int i = 0;i<Access.size();i++){
         AccessorMethods SetGet = (AccessorMethods)
                    InstlibAccessor.get(i);

    HSSFRow row = worksheet.createRow(worksheet.getPhysicalNumberOfRows());
    HSSFCell cell = row.createCell(0);

    cell.setCellValue(new Double(SetGet.getOne()));
    cell.setCellStyle(cellStyle00);


  //other set value codes....

}
FileOutputStream fileOut = new FileOutputStream(fileName + ".xls");
workbook.write(fileOut);
 fileOut.flush();
 fileOut.close(); 

 //catch statements follow
 //end

Wyjście wiersza poleceń i wyjście netbeans nie wskazują żadnego błędu, jak brak pamięci itp. Program się nie kończy ... po prostu się zatrzymuje ... Jak jvm działa na nieskończonej pętli ... Aby rzucić więcej światła na ten temat jest krótki opis mojego programu.

Użytkownik wykonuje program planującyW żądanym czasie program planujący wykonuje program (program planujący i „program” to dwa różne programy / pliki jar. Program planujący po prostu wywołuje słoik)Program rozpoczyna się od utworzenia pliku programu ExcelNastępnie odczytuje bazę danych 1. Baza danych zawiera 80K wierszyDla każdego wiersza, jeśli spełniony jest określony warunek, odczytuje on bazę danych 2 i 3Następnie przechowuje go wewnątrz obiektu arraylistycznego 1000 naraz (staram się unikać wszelkich problemów z pamięcią, więc przechowuję go partiami)Następnie piszę go partiami, 1000 na raz, aby się wyróżnić (to jest część, którą zatrzymuje)po zakończeniu odczytu i zapisu czeka, aż program planujący wywoła go ponownie ... Jeśli osiągnie ten krok, jestem szczęśliwym programistą =)

Oto kilka obserwacji, które znalazłem;

Program zwykle zatrzymuje się przy wykonywaniu programu od czwartego do szóstego (po 4 lub 6 godzinach nieprzerwanego uruchamiania programu planującego)Zatrzymuje się w losowym punkcie zapisu w programie Excel, np. W wierszu 34 tys. Lub 24 lub 15 itd. Itd.Ten błąd nie występuje, gdy wykonam program bez programu planującego. Mogłem go ręcznie wykonać przez cały dzień (zrobiłem to, nie było fajnie) bez żadnych błędów.Wyjściowy plik programu Excel wyświetla rozmiar 0 bajtówJeśli na przykład zaplanowałem uruchamianie co godzinę, a na tę godzinę zatrzymał się. Nadal będzie działał przez kolejne godziny, ale zatrzyma się i zatrzyma w innym punkcie niż poprzedni.

Co mogło spowodować ten problem. Być może wyciek pamięci lub coś prostszego?

dodatkowe informacje

Zaimplementowałem program planujący Quartz, importując klasę innego programu i uruchamiając go jako zadanie. tutaj jest kod spustu

JobDetail job = newJob(ExtractorSchedulerJobUtilTester.class)
            .withIdentity("job1", "group1")
            .build();

    CronTrigger trigger = newTrigger()
            .withIdentity("trigger1", "group1")
            .withSchedule(cronSchedule("0 0/2 * 1/1 * ? *"))
            .build();

    Date ft = sched.scheduleJob(job, trigger);
        sched.start();

i praca

public class ExtractorSchedulerJobUtilTester implements Job {
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
    theProgram program= new theProgram();

    program.main();

    JobKey jobKey = context.getJobDetail().getKey();
    }
}

Czy to możliwe, że;

Aplikacja maksymalizuje moją pamięć i ulega awariiUżywam tylko jednego wystąpienia „programu” w moim zadaniu Quartz, które jest inicjowane przy pierwszym uruchomieniu zadania, a wszystkie kolejne wykonania zadania są przywoływane z tej jednej instancji, co powoduje maksymalizację pamięci.Jego baza danych (AS400) jest powiązana (wątpię, ponieważ przestaje ona działać podczas pisania programu Excel).Komputer staje się zbyt zmęczony i postanawia zrobić sobie przerwę.

AKTUALIZACJA - 28.12.2012

Szczęśliwi noworoczni faceci / dziewczęta !!

Niestety, zajęło mi trochę czasu, zanim wróciłem do tego ... (Po co marnować czas na to, kiedy świat skończy się 21. Był słodko-gorzki, kiedy nie)

Profilowałem swój program za pomocą profilera netbeans i otrzymałem następujące dane za pomocą analizatora pamięci

Zauważyłem na pierwszym wykresie, że mój program zużywa około 75 MB wielkości sterty dla każdej iteracji (jak wskazuje różowy odcień). Czy to oznacza, że ​​zużyta pamięć programu zwiększa się o 75 MB na iterację? Który po kilku iteracjach pochłonie tyle pamięci, która wpłynie na wykonanie programu. Obecnie próbuję zrzucić zrzut stosu. Opublikuję go, gdy tylko uda mi się go uruchomić.

Dodatkowe informacje: Próbowałem użyć profilera tylko z uruchomionym Quartz (nic nie uruchamia), a użycie systemu jest stosunkowo niskie, a rozmiar nie zwiększa się dla każdej iteracji.

W końcu udało mi się uzyskać zrzut sterty. Zrobiłem 2 zrzuty, po pierwsze, gdy miała miejsce pierwsza iteracja, a druga to następna iteracja. Zauważyłem, że istnieje duża różnica między wystąpieniami dwóch moich klas, jak wskazano poniżej

Dzięki!

questionAnswers(1)

yourAnswerToTheQuestion