2015-05-16 15 views
6

Nếu tôi hiểu chính xác, ngăn xếp là dành cho các yếu tố địa phương và tham chiếu đến các đối tượng trong heap. Vậy điều gì xảy ra nếu bạn có nhiều hơn một chủ đề?Có một không gian ngăn xếp cho mỗi luồng không?

Họ có chia sẻ cùng một không gian ngăn xếp cùng một lúc (nhưng các khu vực khác nhau) hay không chuyển ngữ cảnh JRE và tải-tải lại nội dung ngăn xếp khi chuyển đổi giữa các chủ đề?

Hoặc JRE có phân bổ ngăn xếp riêng biệt cho từng chuỗi không?

Trả lời

2

Mỗi luồng có ngăn xếp riêng chứa khung cho mỗi phương pháp thi hành trên chuỗi đó vì bạn có thể thấy here trong phần "Mỗi chủ đề".

2

Hoặc JRE có phân bổ ngăn xếp riêng cho từng luồng không?

Có. The JVM is specified to do so:

Mỗi Java Virtual Machine chủ đề có tin Java Virtual Machine chồng, tạo ra tại cùng thời điểm với các chủ đề. Máy ảo Java ngăn xếp các khung cửa hàng. [...] Vì ngăn xếp Java Virtual Machine không bao giờ được thao tác trực tiếp trừ các khung đẩy và pop, các khung có thể được cấp phát.

4

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.

1

Chủ đề Java được thể hiện bằng đối tượng chuỗi, mỗi luồng được chỉ định một ngăn xếp luồng riêng biệt được sử dụng để lưu trữ dữ liệu thời gian chạy. Ngăn xếp chủ đề có kích thước cụ thể (Có thể được đặt bằng tùy chọn VM java -Xss1m Application).

Nếu trong thời gian chạy, Chủ đề cố gắng lưu trữ ngày nhiều hơn kích thước ngăn xếp cho phép, xảy ra lỗi tràn ngăn xếp.

Các vấn đề liên quan