Hoặc JRE có phân bổ ngăn xếp riêng cho từng luồng không?
Có khái niệm. (Xem ví dụ này JVM spec link.)
Cách khái niệm hóa thông số được thực hiện trong một JVM cụ thể là ... thực hiện cụ thể. Tuy nhiên, sự hiểu biết của tôi là các thế hệ hiện tại (ví dụ: Hotspot) JVM phân bổ mỗi ngăn xếp luồng trong một khối bộ nhớ riêng được yêu cầu từ hệ điều hành; ví dụ. sử dụng một số mmap
syscall .
Chắc chắn không có bản sao bán buôn nội dung ngăn xếp khi chuyển đổi luồng xảy ra. Tuy nhiên, việc chuyển đổi ngữ cảnh luồng sẽ kéo dài quá trình lưu và tải các thanh ghi, và (gián tiếp) để tải thêm vào bộ nhớ cache và các mục TLB. Điều này có thể đáng kể ... đó là lý do tại sao việc chuyển đổi bối cảnh luồng quá mức (ví dụ: do tranh chấp khóa hoặc chờ đợi/thông báo quá mức) có thể không tốt cho hiệu suất.
1 - Tôi còn nhớ một số JVM bao gồm một chỉ đọc trang "đỏ-zone" ở phần cuối của mỗi đoạn ngăn xếp. (Điều này có nghĩa là tràn ngăn xếp luồng gây ra lỗi bộ nhớ và JVM không cần phải kiểm tra rõ ràng luồng tràn ngăn xếp trên mỗi cuộc gọi phương thức, đó sẽ là một hiệu suất đáng kể.) Dù sao thì, hiểu biết của tôi là "vùng đỏ "trang yêu cầu ngăn xếp chuỗi được yêu cầu bằng cách sử dụng mmap.
Nguồn
2015-05-16 01:19:45