No więc tak... (dużo tego się nazbierało):
Zacząłem od ustalenia ile zajmują obiekty, które tworze. Skorzystałem do tego z małego programiku znalezionego tutaj:
http://www.roseindia.net/javatutorials/determining_memory_usage_in_java.shtml
No i wynik jest 472 bajty na obiekt mojej klasy "Panelik". W innej klasie (klasie głównej programu) tworze obiekty tej klasy dodajac do nich listenera (fragmet kodu):
pole[k][i][j] = new Panelik();
obsluga obsl = new obsluga(k,i,j);
pole[k][i][j].addMouseListener(obsl);
Ile zajmuje klasa obsluga? Wychodzi na to ze 24bajty. Sprawdzone rownież tym samym programikiem. No i dla pewności sprawdziłem jeszcze, ile zajmuje obiekt klasy Panelik wyposazony w takiego listenera, no i jest 496 bajtow. (Pomijam milczeniem to jak bardzo mało efektywne jest: a) tworzenie tablicy 3 wymiarowej tak duzych obiektow, b) dodawanie tego MouseListenera . Niestety wcześniej nie zdawałem sobie z tego sprawy, no ale zostawmy to, bo akurat tutaj wiem co i jak poprawić. Tak czy siak widze inny problem w calym tym dzialaniu.
Mianowicie:
Podazylem za sugestia i podpowiedziami Olamagato, tj: ustawilem identyczne wartosci dla Xms i Xmx oraz wykorzystuje metody Runtime'a w przedstawiony wczesniej sposob. Czyli. uruchamiam cala aplikacje z jakimis podstawoymi ustawieniami. Na koniec sprawdzam ile to wszystko zajelo pamieci. Aplikacje mozna podzielc na czesc "o niezmiennej wielkosci" (stalej bez wzgledu na wielkosc realizowanego projektu) oraz "czesc zmienna". Do obliczenia ilosci zajmowanej pamieci przez "czesc zmienna" stosuje napisana metode (przelicznik na podstawie opisu wspomnianego przez Olamagato. Zakladam ze moj przelicznik jest prawidlowy, gdyz przedstawia wartosci zgodne z programikiem znalezionym w necie)
No i teraz w momencie gdy uzytkownik decyduje ze program oferuje mu zbyt male mozliwosci pobieram wartosci ktorych on żada. I dokonuje sprawdzenia warunku:
("waga" calej aplikacji) - ("waga" jej "części zmiennej")+("waga" żądanej części zmiennej (z przelicznika)) < mojRuntime.maxMemory() ;
No i do tego co dłużej nie jest potrzebne przypisuje null'e i tworze nowe, odpowiednio wieksze poszczegolne skladowe.
Do obserwacji tego co dzieje się z pamięcią używam JConsole i zastanawia mnie kilka rzeczy:
-
Czy wskazane jest takie maksymalne zapychanie pamięci,czy może jakiś procent dobrze byłoby pozostawić wolny (jaki?) ?
-
Czy dobrze by bylo ustawic JVM jakies jeszcze parametry poza -Xmx i Xms dotyczace podzialu poszczegolnych czesci heap'a (jakie?) ?.
-
Zastanawia mnie rowniez sam GC. No bo chyba mozna go tez jakos dobrac, wydaje mi sie ze nie ma on zbyt duzo roboty poza momentami wywolywanych przeze mnie przeladowan (myslalem nad "Concurrent Low Pause Collector" aby posprzatac raz a dobrze zamiast angazowac GC czesto bez sensu.
(To moje pierwsze zetkniecie z obsluga Jconsole i tematem GC, więc prosze o wyrozumialość. )
aa... i jeszcze jedno, zauważylem ze metoda maxMemory() zwraca rozne wartosci nawet w niewielkich odstepach czasu (rowniez w jconsole zauwazam przebieg piłokształtny zajętej pamięci), co chyba moze powodowac katastrofe jesli dokonuje sprawdzenia warunku przedstawionego wyzej?