Lub czy JRE przydziela osobne stosy dla każdego wątku?
Konceptualnie tak. (Zobacz na przykład: JVM spec link).
W jaki sposób konceptualizacja specyfikacji jest wdrażana w konkretnej maszynie JVM, jest ... konkretna implementacja. Jednakże rozumiem, że JVM bieżącej generacji (np. Hotspot) przydzielają każdy stos wątków w osobnym bloku pamięci żądanym od systemu operacyjnego; na przykład przy użyciu modelu mmap
syscall .
Z pewnością nie ma hurtowego kopiowania zawartości stosu po przełączeniu wątku. Jednak przełączanie kontekstu wątku nie wymaga zapisywania i wczytywania rejestrów oraz (pośrednio) dodatkowego obciążania pamięci podręcznej i wpisów TLB. Może to być znaczące ... i dlatego nadmierne przełączanie kontekstu wątku (np. Spowodowane rywalizacją blokadą lub nadmiernym oczekiwaniem/powiadomieniem) może być szkodliwe dla wydajności.
1 - Pamiętam, że niektóre JVM należą tylko do odczytu stronę „czerwonej strefy” na końcu każdego segmentu stosu. (Oznacza to, że przepełnienie stosu wątków wyzwala błąd pamięci, a JVM nie musi jawnie sprawdzać przepełnienia stosu podczas każdego wywołania metody, co byłoby znaczącym trafieniem wydajności). W każdym razie rozumiem, że "strefa czerwona" "strona wymaga podania stosu wątków za pomocą mmap.