Odchudzanie jara z nieużywanych klas

0

Piszę hobbystycznie prostą aplikację w czystej javie 11 na urządzenie, które ma tylko 64MB RAM i każde 512KB jest dla mnie istotne. Po kompilacji jar ma prawie 4MB co jest dla mnie wartością nieakceptowalną biorąc pod uwagę jej funkcjonalność. Czy jest jakaś opcja żeby oczyścić projekt z klas które nie są wykorzystywane w runtimie? Ręczne usuwanie plików jest też rozwiązaniem ale dosyć żmudnym. inb4 Nie znam C i wincyj RAMu nie wejdzie.

2

Skompiluj do natywnej apki graalvm

1

na Androida jest jakieś narzędzie do usuwania niepotrzebnych klas ale nie pamiętam nazwy :( nie wiem czy zadziała na zwykłą Javę :(

0

Jlink

1
heretic napisał(a):

Piszę hobbystycznie prostą aplikację w czystej javie 11 na urządzenie, które ma tylko 64MB RAM i każde 512KB jest dla mnie istotne. Po kompilacji jar ma prawie 4MB co jest dla mnie wartością nieakceptowalną biorąc pod uwagę jej funkcjonalność

Co ma RAM do Jara? JVM ładuje klasy leniwie, to czego nie używasz i tak nie jest ładowane. Jak dbasz o ram to poczytaj jak to zrobić w JVMie a nie jak odchudzać jara. Zacznij np tutaj https://shipilev.net/jvm/anatomy-quarks/12-native-memory-tracking/

Moje apki w Go potrafią zajmować po 60MB na dysku a jak ją uruchomię to zżera 4MB ramu. Normalnie jakaś magia

0
KamilAdam napisał(a):

na Androida jest jakieś narzędzie do usuwania niepotrzebnych klas ale nie pamiętam nazwy :( nie wiem czy zadziała na zwykłą Javę :(

Są jakieś D8, R8 shrinkers, ale z posta opa nie wynika co to za urządzanie, ani jaki ma runtime.

0
slsy napisał(a):

Co ma RAM do Jara? JVM ładuje klasy leniwie, to czego nie używasz i tak nie jest ładowane.

Dzięki. W sumie to zamyka temat. Właśnie doczytałem, że faktycznie tak jest :D
OS to debian stretch a jre to jakaś wypatroszona java ze zbędnych funkcjonalności. Myślałem, że trochę mi się uda mi się zejść ze zużycia aby system nie robił swapa na karcie SD.

0

Spróbuj te tricki, które są napisane w podlinkowanym przeze mnie artykule. Na pewno warto spróbować ustawić bardzo mały heap np. -Xmx16m -Xms16m i obserwować co się dzieje.

3

Zalecał bym bardzo dużą ostrożność z usuwaniem klas, zwłaszcza AD 2024 gdzie refleksja i skanowanie classpath króluje w wielu bibliotekach. Można się wpierdzielić w dziwne błędy i kłopoty jak brak resource'ow lub class not found.

Jak to ma być takie małe to po pierwsze sprawdź ile waży JVM na tym urządzeniu, może twój jar to 1% całego rozmiaru aplikacji z runtime'em.

Po drugie to że w jar jest 1GB nie znaczy że tyle będzie w pamięci. Java wczytuje klasy leniwie, to jest wczytuje tylko tyle ile jest faktycznie potrzebne (dlatego należy unikać libów które będą skanować cały jar i ładować w ten sposób wszystkie klasy).

GraalVM zbundluje JVM i apkę i od razu przerobi na natywny kod, to najlepsze wyjście.
jlink to druga dobra opcja, aplikacja musi korzystać z java modules żeby zaczęło w ogóle działać. Zaoszczędzisz głównie na rozmiarze JVM (wyrzuci moduły z JVM których nie używasz).

To że jest 64MB ram, nie znaczy że system nie da więcej. Jeżeli to linux to można ustawić Swap.

Niemniej widać że język nie dobrany do systemu. C++ / QT lepiej tutaj pasuje, nawet Python pewnie dałby lepszy rezultat.

5

Z ciekawostek historycznych. Pierwszy serwer w javie jaki pisałem działał na maszynie z 4mb ram (tak, megabajty). jakiś Linux - rok 1999 chyba (java 1.2 albo 1.3 - zupełnie normalna).
Na tych 4mb działało to bardzo kiepsko.
Linux nie był zoptymalizowamy, troche serwisów działało tam bez sensu - nie poprawiało to sytuacji. Dodatkowo ten serwer w javie odpalał CORBę :-)

W pewnym momencie udało sie jednak wyprosić kolejne 4mb - i na 8mb już wszystko śmigało jak szalone.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.