#programowanie #java #javaee Hej, mam aplikację w JavaEE (Spring + JSF + Hibernate + Primefaces + OracleDB). Jest w niej funkcja generująca pdfy i zapisująca je do bazy danych. Ogólny schemat generowania pliku pdf wygląda następująco: - pobranie zrzutu mapy z innej aplikacji za pomocą IOUtils.toByteArray - wyrenderowanie widoku JSF(z opisem mapy) do pliku PDF i dodanie do niego tej właśnie mapy - dodanie/edycja rekordu w bazie z tym właśnie plikiem. Ogólnie funkcja działa dobrze, ponieważ jest zwykle używana dla jednego obiektu. Problem pojawia się, gdy chcę zrobić skrypt przetwarzający ponad 10k rekordów. Jedna sprawa, że idzie to bardzo mozolnie ale raczej tego nie przeskoczę ale też skrypt wraz z czasem zżera coraz więcej pamięci(do 0,5 MB na 1 rekord). Analizuję właśnie wyciek pamięci przez JVisualVM ale nie bardzo ogarniam temat. Z tego co widzę, to pojawiają się duże ilości obiektów typu HashMap$Node, HashMap$Node[], HashMap które nie znikają. Czy jest jakaś możliwość podglądnięcia skąd te obiekty pochodzą i dlaczego GC ich nie usuwa? Wydaje mi się, że to jest związane z tym renderowaniem widoku JSF do pliku pdf. Z góry dzięki za pomoc bo ja wymiękam. Nawet nie chodzi o poprawę kodu tylko znalezienie przyczyny ale jak będzie trzeba to podrzuce kawałek kodu.
@cinek181992: a nie lepiej przechowywać w bazie tylko rzeczy niezbędne do wygenerowania pdfa, a nie odkładać całego pdfa? Zakładam , że więcej czasu zajmie ci odczyt/zapis pdfa, niż generowanie.
@eovenn: Niestety, takie były założenia projektu, że muszą być zapisane w bazie danych i metody generowania pliku nie dam rady zmienić. Jedynie co mogę to usprawnić mechanizm. Może z tym 0,5 MB troche przesadziłem pewnie tak z max 100KB
zrzut pamięci zrób gdy się zapcha i odczytaj eclipse MAT tylko nie za duży bo się powiesi i tam go przejrzyj dokładnie. Możliwe że iText sobie nie radzi i zostawia jakieś śmieci ostatnio miałem podobny przypadek ale z FOP gdzie nie czyścił SVG i zostawały w pamięci. Możesz użyć też jprofilera trial na tydzień
Hej,
mam aplikację w JavaEE (Spring + JSF + Hibernate + Primefaces + OracleDB). Jest w niej funkcja generująca pdfy i zapisująca je do bazy danych. Ogólny schemat generowania pliku pdf wygląda następująco:
- pobranie zrzutu mapy z innej aplikacji za pomocą IOUtils.toByteArray
- wyrenderowanie widoku JSF(z opisem mapy) do pliku PDF i dodanie do niego tej właśnie mapy
- dodanie/edycja rekordu w bazie z tym właśnie plikiem.
Ogólnie funkcja działa dobrze, ponieważ jest zwykle używana dla jednego obiektu. Problem pojawia się, gdy chcę zrobić skrypt przetwarzający ponad 10k rekordów.
Jedna sprawa, że idzie to bardzo mozolnie ale raczej tego nie przeskoczę ale też skrypt wraz z czasem zżera coraz więcej pamięci(do 0,5 MB na 1 rekord). Analizuję właśnie wyciek pamięci przez JVisualVM ale nie bardzo ogarniam temat. Z tego co widzę, to pojawiają się duże ilości obiektów typu HashMap$Node, HashMap$Node[], HashMap które nie znikają. Czy jest jakaś możliwość podglądnięcia skąd te obiekty pochodzą i dlaczego GC ich nie usuwa? Wydaje mi się, że to jest związane z tym renderowaniem widoku JSF do pliku pdf.
Z góry dzięki za pomoc bo ja wymiękam. Nawet nie chodzi o poprawę kodu tylko znalezienie przyczyny ale jak będzie trzeba to podrzuce kawałek kodu.