2010-07-05 19 views
11

Mamy małe pole tekstowe z 512 MB pamięci RAM. Chcieliśmy zobaczyć, ile wątków możemy utworzyć w Javie w tym polu. Ku naszemu zaskoczeniu nie możemy stworzyć wielu. Zasadniczo minimalny rozmiar stosu, który można ustawić za pomocą -Xss, wynosi 64k. Prosta matematyka powie, że 64 * 7000 pochłonie 430Mb więc byliśmy tylko w stanie dostać się do około 7000 lub więcej wątków i wtedy napotkał ten błąd:Java jest bardzo ograniczona pod względem maksymalnej liczby wątków?

java.lang.OutOfMemoryError: unable to create new native thread. 

Czy to prawdziwa granica z Java? Na 512 MB pamięci RAM możemy tylko wycisnąć 7k liczby wątków?

+1

Czy naprawdę potrzebujesz tak wielu wątków? Ile cpus/rdzeni ma maszyna? – Bwmat

+0

Planujemy wspierać wielu klientów. Jest hostowany na wirtualnej chmurze, więc nie jestem pewien. – erotsppa

+17

Jeśli potrzebujesz 7000 natywnych wątków, masz poważną wadę konstrukcyjną w swojej aplikacji. –

Odpowiedz

2

To nie jest język programowania, tylko na poziomie systemu operacyjnego.

Więcej czytanie o tym, dla systemu Windows:

+0

W tej osobie oni osiągają limit pamięci, zanim kiedykolwiek osiągną limit jądra. –

+0

@Jason - rzeczywiście, przegapiłem "OutOfMemoryError" po drodze. – Gnoupi

+3

Wierzę, że "OutOfMemoryError: niezdolny do utworzenia nowego wątku natywnego" * może * być spowodowane przez limit wątków systemu operacyjnego, mimo że jest to OutOfMemoryError. Nie jest to jednak w 100% pewne. – ColinD

2

Należy pamiętać, że nigdy nie będzie w stanie poświęcić 100% pamięci RAM do uruchamiania wątków Java. Część pamięci RAM jest używana przez system operacyjny i inne uruchomione aplikacje, co oznacza, że ​​nigdy nie będziesz mieć dostępnej pełnej 512 Mb.

0

Spróbuj ustawić maksymalną dozwoloną ilość pamięci -Xmx na niższą wartość i sprawdź, czy liczba wątków może zostać zwiększona. W projekcie w pracy mogłem przydzielić około 2,5 tys. Wątków z opcją -Xmx512m i około 4k wątków z opcją -Xmx96m.

Im większa twoja sterta, tym mniejsza przestrzeń stosu wątków (przynajmniej dla mojego doświadczenia).

3

Po utworzeniu wątków 7k, nie będziesz mieć żadnej pamięci do robienia niczego użytecznego. Być może powinieneś przemyśleć projekt swojej aplikacji?

W każdym razie, czy 512 MB nie jest dość małe? Być może mógłbyś podać nieco więcej informacji na temat swojej aplikacji lub domeny?

8

Użyj asynchronicznego IO (java nio) i nie będziesz potrzebował 7k wątków do obsługi klientów 7k, wystarczy kilka wątków do obsługi io (5?).
Spójrz na ;)

Jeden wątek dla każdego klienta to naprawdę zły projekt.

+0

Czy liczba wątków nio jest nadal ograniczona? Mam do czynienia z biblioteką 3rd party, która wydaje się tworzyć tysiące wątków, używa nio tho ... Wydaje się powodować ten sam błąd opisany przez OP ... –

1

Nie potrzebujesz jednego wątku na sesję klienta. Jeśli spojrzysz na sposób, w jaki serwer J2EE (lub JavaEE) obsługuje wiele połączeń, używa kombinacji strategii, takich jak współbieżność, kolejkowanie i zamiana. Zwykle można skonfigurować maksymalną liczbę współbieżnych wystąpień na żywo i wartości limitu czasu bezczynności w czasie wdrażania w celu dostrojenia wydajności aplikacji.

Powiązane problemy