Skocz do zawartości
Kashi66

Debian 7 - Java i pamieć RAM

Polecane posty

Witam!

Mam problem z pamięcią ram na moim VPSie a mianowicie mam ustawione maksymalnie 64mb ktore ma być przydzielone do programu ale z niewiadomych przyczyn ten ogranicznik nie działa.

Niby w webminie pokazuje na głównej: http://scr.hu/2itp/lerd5 ale już w procesach: http://scr.hu/2itp/h5f6n

Na panelu w hosteam tez pokazuje inna wartość niz ta na głównej w webminie: http://scr.hu/2itp/mgben
Da rade jakoś ustawić ten limit na 64mb bo boje sie ze jak wysypie sie java to mi zablokują vpsa.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Odpalam go w screenie z

 screen -dmS bot java -Xmx64M -jar JTS3ServerMod.jar

Mało sie na javie znam, na internecie wyczytałem ze -Xmx ogranicza ram przydzielany javie ale to nie działa u mnie. Dodam jeszcze ze mam Jave 7 JDK

Edytowano przez Kashi66 (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zaktualizuj sobie Javę do najnowszej wersji i nie przejmuj się blokadą serwera - możesz wykorzystać tyle pamięci ile kupiłeś ;)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie ogranicza.

Raczej powinieneś użyć

MaxPermSize

 

 

Zaktualizuj sobie Javę do najnowszej wersji i nie przejmuj się blokadą serwera - możesz wykorzystać tyle pamięci ile kupiłeś ;)

I co to ma dać? Pytanie jest o limitowanie wykorzystania pamięci, a nie wykorzystywanie całej dostępnej.
  • Upvote 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

-Xmx limituje tylko wartość stosu (heap size). Nie ograniczysz w ten sposób wykorzystania pamięci dla Javy, ogólnie może to być bardzo trudne w ten sposób.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie ogranicza.

Raczej powinieneś użyć

MaxPermSize

 

Użyłem

screen -dmS bot java -Xmx64m -XX:MaxPermSize=64m -jar JTS3ServerMod.jar

I nadal nie chce ograniczyć pamieci: http://scr.hu/2itp/0tyqv http://scr.hu/2itp/cs1oe

 

-Xmx limituje tylko wartość stosu (heap size). Nie ograniczysz w ten sposób wykorzystania pamięci dla Javy, ogólnie może to być bardzo trudne w ten sposób.

A da rade zrobić coś by po wysypaniu programu nie zasypało mi całej pamieci?

 

 

 

Edytowano przez Kashi66 (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

W samej komendzie Java tego nie ograniczysz, nie ma takiej opcji.

 

Możesz coś pokombinować z ulimit oraz /etc/security/limits.conf

  • Upvote 1

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

W samej komendzie Java tego nie ograniczysz, nie ma takiej opcji.

 

Możesz coś pokombinować z ulimit oraz /etc/security/limits.conf

Ustawiłem ulimit -v 131072 oraz -m 131072 czyli na 128mb, polecenie startowe ma -Xmx64m wiec nie powinno być problemu z pamięcią ale java sypie błędami:

Error occurred during initializtion of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

@edit

 

Teraz pytanie mam trochę techniczne a mianowicie według webmina po uruchomieniu skryptu mam wolne fizycznie ~400mb ramu a cos koło 300mb jest w cache. Na panelu hosteam pokazuje mi niby zajętość ramu ~85% a fizycznie przecież używam tylko 100mb wiec o co chodzi?

@edit2
Na tiktalik.com pozwalają na skrypty w javie? 8zł za miesiąc nie jest dużo a 1gb ramu wystarczająco jak dla mnie.
Edytowano przez Kashi66 (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Java alokuje pamięć dynamicznie, podobnie jak i C#, a to co ty jako użytkownik możesz kontrolować to tylko i wyłącznie to jak agresywny ma być GC (i maszyna wirtualna/framework), i też wyłącznie do pewnego stopnia.

 

Poeksperymentuj sobie z takimi ustawieniami jak MinHeapFreeRatio, MaxHeapFreeRatio, MaxPermSize. -Xmx kontroluje tylko wielkość heapu.

 

Jak chcesz się bawić pamięcią to zrozum jak dokładnie ona działa. Zarówno java jak i C# kierują się zasadą szybkiej alokacji, wolnego zwalniania. Mam tu na myśli to, że alokuje się X pamięci, gdzie ten X to będzie maksymalny usage (tzw. peak) podczas działania aplikacji, a następnie nawet jeśli GC wyczyści to co nie jest już używane, to ta wyczyszczona pamięć nie trafia z powrotem do OSu (od razu), tylko zostaje jako zaalokowana do procesu, tak żeby nie było trzeba ponownie prosić OSu o zaalokowanie pamięci. Jest to spowodowane tym, że alokacja pamięci po stronie OSu jest kosztowna, a aplikacja jest w stanie działać szybciej gdy GC zarządza pamięcią i nie musi się prosić o alokowanie/dealokowanie pamięci przez OS. Dopiero gdy po dłuższym używaniu maszyna wirtualna/GC zauważy, że w zasadzie to była sytuacja jednorazowa i nie musimy tej pamięci tyle trzymać, może zdecydować o oddaniu jej z powrotem do OSu.

 

To w którym momencie oddać OSowi pamięć zależy właśnie od tego jak agresywny jest GC, a tym zarządzają ustawienia FreeRatio które Ci podlinkowałem wyżej.

 

Nie ograniczaj javie pamięci, bo to nie ma sensu. Poinstruuj ją zamiast tego, żeby zwracała to, co jej nie potrzebne tak szybko jak to możliwe. Ograniczanie pamięci jedyne co spowoduje to właśnie errory typu out of memory, bo nie jesteś w stanie kontrolować peaku. Mam sam od groma aplikacji napisanych w C# odpalanych przez mono i jest to bardzo powszechne zjawisko, że aplikacja zaraz po odpaleniu potrafi używać 7% pamięci, a po godzinie-dwóch spaść do 4.5%, cały czas działając i wykonując te same zadania.

Edytowano przez Gość (zobacz historię edycji)
  • Upvote 3

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dziękuję za bardzo dobre wyjaśnienie!

Temat można już zamknąć. Dowiedziałem sie tego co chciałem i bardzo dziękuje @Archi, @Miłosz oraz @Desavil za pomoc!

 

Moje konto jest za nowe by mogłem dawać plusy wiec proszę o plusy dla Panów wyżej jeśli można.

Edytowano przez Kashi66 (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się


×