Tôi đang cố gắng xác định dung lượng bộ nhớ ngăn xếp mà mỗi phương thức tiêu thụ khi chạy. Để làm nhiệm vụ, tôi đã nghĩ ra chương trình đơn giản này sẽ chỉ buộc một StackOverflowError
,Suy ra sử dụng bộ nhớ ngăn xếp của phương thức trong Java
public class Main {
private static int i = 0;
public static void main(String[] args) {
try {
m();
} catch (StackOverflowError e) {
System.err.println(i);
}
}
private static void m() {
++i;
m();
}
}
in một số nguyên nói với tôi bao nhiêu lần m()
được gọi. Tôi đã tự đặt kích thước ngăn xếp của JVM (-Xss
tham số VM) với các giá trị khác nhau (128k, 256k, 384k), thu thập các giá trị sau:
stack i delta
128 1102
256 2723 1621
384 4367 1644
đồng bằng đã được tính toán của tôi, và đó là giá trị giữa người cuối cùng dòng của tôi và của người hiện tại. Đúng như dự đoán, nó đã được sửa. Và có nằm trong vấn đề. Như tôi biết sự gia tăng bộ nhớ kích thước ngăn xếp là 128k, mang lại một cái gì đó giống như một bộ nhớ 80byte sử dụng cho mỗi cuộc gọi (mà có vẻ phóng đại).
Nhìn lên m()
trong BytecodeViewer, chúng tôi có được độ sâu tối đa của chồng 2. Chúng tôi biết đây là một phương pháp tĩnh và rằng không có this
tham số đi qua, và rằng m()
không có đối số. Chúng ta cũng phải xem xét đến con trỏ địa chỉ trả về. Vì vậy, nên có một cái gì đó như 3 * 8 = 24 byte được sử dụng cho mỗi cuộc gọi phương pháp (tôi giả định 8 byte cho mỗi biến, mà tất nhiên có thể được hoàn toàn tắt. Có phải không?). Thậm chí nếu nó nhiều hơn một chút, hãy nói 48byte, chúng tôi vẫn còn cách xa giá trị 80bytes.
Tôi nghĩ rằng nó có thể có liên quan đến bộ nhớ, nhưng sự thật là trong trường hợp đó chúng tôi sẽ có giá trị khoảng 64 hoặc 128 byte, tôi muốn nói.
Tôi đang chạy một JVM 64 bit theo Hệ điều hành Windows7 64 bit.
Tôi đã đưa ra một số giả định, một số giả định có thể hoàn toàn tắt. Là trường hợp đó, tôi là tất cả tai.
Trước khi bất cứ ai bắt đầu hỏi tại sao tôi đang làm điều này I must be frank..
Đó là một số thông tin sâu sắc, thưa ngài. Mặc dù vậy, bạn có thể đưa ra giả thuyết về lý do tại sao mỗi cuộc gọi phương thức dường như mất 80 byte? –
Tôi có thể cho bạn biết thông tin nào về việc triển khai JVM của riêng tôi nắm giữ trong cấu trúc Khung? – Jivings
@devouredelysium Cập nhật câu trả lời của tôi với nguồn OpenJDK. – Jivings