Dnia 17.07.2015
or...@pwr.wroc.pl <
or...@pwr.wroc.pl> napisał/a:
> "Mój" use-case to HPC więc zwyczajnie spodziewałem się, że ta sama aplikacja w
> Javie będzie chciała 2-3 razy więcej pamięci niż ten sam algorytm zapisany w C
> lub nawet pythonie. To też raczej wiedza zdobyta empirycznie bez znajomości
> samej Javy. Masz może gdzieś materiały nt. jak przydusić Javę żeby potrzebowała
> mniej więcej tyle samo pamięci co zbliżone algorytmy zapisane w innych językach?
Aż tak przydusić Javę, żeby pamięciowo była porównywalna z C, to się nie da
(to jednak wirtualizacja a nie aplikacja natywna i to w dodatku
wirtualizacja na emulowanej maszynie a nie fizycznej, sam "emulator" swoje
waży), poza tym w Javie wszystko jest pakowane w obiekty (no prawie
wszystko :D) a to też daje dodatkowy narzut w porównaniu do struktur w C.
Generalnie Javy się nie "dusi na maksa", bo nie ma sensu aby RAM leżał
odłogiem, tylko ustawia takie limity aby Java mogła korzystać z jak
największej ilości RAM, ale nie "przeginała".
Trzeba by było odpalić jvisualvm (część JDK, nie ma tego w JRE)
i "podłączyć" się do aplikacji (można z innego komputera, Java VisualWM nie
musi chodzić na tym samym komputerze co badana aplikacja) i sprawdzić ile
rzeczywiście tego RAM-u aplikacja potrzebuje do pracy (bo alokować w
systemie może znacznie więcej tylko po to, aby nie było potrzeby częstego
uruchamiania garbage collectora, dodatkowo Java trzyma też w pamięci
"przekompilowany w locie do postaci natywnej" najczęściej używany kod) i
dopiero wtedy można myśleć o ustawianiu limitów (ale też bez "duszenia", bo
to nie ma sensu).
A do Pythona nie ma co porównywać, to zupełnie różne klasy wydajności.