Tùy chọn JVM -Xss - Chính xác thì nó làm gì?


Câu trả lời:


269

Mỗi luồng trong một ứng dụng Java có ngăn xếp riêng . Ngăn xếp được sử dụng để giữ địa chỉ trả về, đối số cuộc gọi hàm / phương thức, v.v. Vì vậy, nếu một luồng có xu hướng xử lý các cấu trúc lớn thông qua các thuật toán đệ quy, nó có thể cần một ngăn xếp lớn cho tất cả các địa chỉ trả về đó. Với Sun JVM, bạn có thể đặt kích thước đó thông qua tham số đó.


11
Vì vậy, tùy chọn -Xss được sử dụng để giới hạn dung lượng mà một ngăn xếp tiêu thụ (bằng cách lưu trữ địa chỉ trả về, các biến, v.v.) và cũng gián tiếp giới hạn độ sâu của một ngăn xếp? Tôi có đúng không?
instantsetsuna

5
@instantsetsuna: Tôi nghĩ rằng việc sử dụng phổ biến hơn có lẽ là để tăng giới hạn mặc định. (Luôn có giới hạn.) Nhưng đúng vậy, bạn đang kiểm soát kích thước của ngăn xếp, điều khiển mức độ sâu của ngăn xếp có thể nhận được.
TJ Crowder

Làm thế nào để bạn thực hiện tương đương với cài đặt XSS này trên trình biên dịch java (hay còn gọi là javac)? Đây là một vấn đề đối với những người sử dụng các thư viện dựa trên scala gây ra đệ quy đuôi lớn xảy ra trong quá trình biên soạn các lớp - Andrew Norman 9 giây trước
Andrew Norman

@AndrewNorman: Bạn không biên dịch các tùy chọn thời gian chạy Java vào tệp lớp, đó là một điều đặc thù môi trường hơn. Nếu bạn thực sự cần phải làm điều đó bằng mã, bạn có thể viết một lớp chính nhỏ bé với công việc duy nhất là khởi chạy ứng dụng thực sự của bạn với các tùy chọn bạn cần.
TJ Crowder

@AndrewNorman Bạn có thể cung cấp các cờ cấu hình JVM mà trình biên dịch sẽ chạy bằng cách sử dụng -Jflagcú pháp (ví dụ -J-Xss:).
francoisr

166

Nó thực sự đặt kích thước ngăn xếp trên một JVM.

Bạn nên chạm vào nó trong một trong hai tình huống sau:

  • StackOverflowError (kích thước ngăn xếp lớn hơn giới hạn), tăng giá trị
  • OutOfMemoryError: không thể tạo luồng gốc mới (quá nhiều luồng, mỗi luồng có một ngăn xếp lớn), giảm nó.

Cái sau thường xuất hiện khi Xss của bạn được đặt quá lớn - sau đó bạn cần cân bằng nó (thử nghiệm!)


3
Không nhất thiết là mọi lúc thực sự. Cả SOE và OOME đều có thể xảy ra vì những lý do khác nhau cần được khắc phục khác nhau.
noego

4
Đúng, nhưng tôi không nói -Xss là nguyên nhân duy nhất cho SOE và OOME, nhưng ngược lại - nếu đặt không chính xác, nó có thể gây ra một trong hai.
Adam Adamaszek

5

Mỗi luồng có một ngăn xếp được sử dụng cho các biến cục bộ và các giá trị bên trong. Kích thước ngăn xếp giới hạn mức độ sâu của các cuộc gọi của bạn. Nói chung đây không phải là thứ bạn cần thay đổi.


4

Nếu tôi không nhầm, đây là điều cho JVM biết bao nhiêu cuộc gọi liên tiếp mà nó sẽ chấp nhận trước khi phát hành StackOverflowError. Không phải cái gì bạn muốn thay đổi nói chung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.