2012-05-08 15 views
7

Obecnie uczę się o aktorach w Scali. Książka zaleca stosowanie metody react zamiast receive, ponieważ pozwala to systemowi używać mniej wątków.Czy wiele wątków w aplikacjach JVM jest drogich?

Przeczytałem why creating a thread is expensive. Ale jakie są powody, dla których, gdy już masz wątki (które powinny obowiązywać dla systemu aktorów w Scali po inicjalizacji), posiadanie ich jest drogie?

Czy to głównie zużycie pamięci? Czy są jakieś inne powody?

+0

Należy zauważyć, że to pytanie dotyczy narzutów wątków * po * utworzeniu, więc nie jest duplikatem połączonego pytania. Które zostało już faktycznie zadeklarowane w pytaniu ... – rolve

Odpowiedz

10

Korzystanie wiele wątków może być droższe niż można się spodziewać, ponieważ:

  • każdy wątek zużywa pamięć poza sterty która stawia ograniczenie ile nici mogą być tworzone w ogóle dla JVM;
  • Przełączanie z jednego wątku na inny pochłania trochę czasu procesora, więc jeśli masz aktywność, którą można wykonać w jednym wątku, zaoszczędzisz cykle procesora;
  • Istnieje program planujący JVM, który ma więcej pracy do wykonania, jeśli jest więcej wątków. To samo dotyczy bazowego programu planującego OS;
  • na koniec nie ma większego sensu używanie więcej wątków niż rdzenie procesora dla zadań związanych z procesorem i nie ma większego sensu używanie więcej wątków we/wy niż operacje we/wy (np. Klienci sieci).
+4

warto zauważyć, że komentarz "JVM scheduler" sugeruje, że twoje przerwy w GC będą nieco większe (ponieważ potrzeba więcej czasu, aby doprowadzić wszystkie wątki do punktu bezpiecznego), prawdopodobnie bardziej zauważalne na młodych genach pauzy – Matt

+0

@Matt to fajny punkt! Dziękuję Ci! –

2

Poza obciążeniem pamięci związanym z gwintem (który może być mały lub nie), posiadanie większej liczby wątków będzie oznaczać, że harmonogram będzie zawierał więcej elementów do rozważenia, gdy nadejdzie czas na wybranie wątku. otrzyma procesor w następnej kolejności.

Niektóre systemy operacyjne/maszyny JVM mogą również zawierać ograniczenia dotyczące liczby wątków, które mogą jednocześnie występować.

Ostatecznie jest to nagromadzenie niewielkich kosztów ogólnych, które w końcu mogą bardzo wiele wyjaśnić. I nic z tego nie jest tak naprawdę specyficzne dla Javy.

2

Posiadanie nici w pobliżu nie jest "drogie". Oczywiście zależy to od tego, o ilu tu mówimy. Podejrzewam, że miliardy wątków będą problemem. Myślę, że ogólnie mówiąc, posiadanie wielu wątków jest uważane za drogie, ponieważ możesz wykonywać więcej pracy równoległej, więc procesor idzie w górę, pamięć idzie w górę itd. Ale jeśli są one poprawnie zarządzane (połączone np. W celu ochrony zasobów systemowych), to w porządku. JVM niekoniecznie używa natywnych wątków, więc wątek Java niekoniecznie jest mapowany do rodzimych wątków systemu operacyjnego (np. Patrz np. Na zielone wątki lub lekkie wątki). Moim zdaniem nie ma żadnych ukrytych kosztów dla wątków w JVM. Koszt wynika z niewłaściwego zarządzania wątkami i nadużywania zasobów przez niedbałe przypisywanie im pracy.

+1

To jak dotąd najlepsze wytłumaczenie, więc +1. –

+0

Oczywiście, że jest "drogi". Wykorzystuje pamięć. Domyślne jest 1MB/wątek na maszynie 64-bitowej. Tak więc 1000 wątków => 1 GB. Możesz mieć 32 GB i nie przejmuj się, ale "niedrogi" wprowadza w błąd. –

Powiązane problemy