OK, đã tìm ra sự cố. Thực sự không có đệ quy nào trong mã của tôi. Nó thực sự có thể gọi các hàm JavaScript với hàng trăm đối số nếu chúng là các hàm "varargs" như ví dụ <array>.splice(...)
, là kẻ phạm tội của tôi.
Ngoài: GWT triển khai chức năng Java System.arraycopy(...)
sử dụng chức năng ghép nối JavaScript theo cách thông minh hơn hoặc ít hơn.
mối nối chấp nhận số lượng phần tử đầu vào tùy ý để chèn vào mảng đích. Nó có thể vượt qua những yếu tố đầu vào từ mảng khác bằng cách sử dụng các cấu trúc sau:
var arguments = [index, howmany].concat(elements);
Arrays.prototype.splice.apply(targetarray, arguments);
này tương đương với cách gọi:
targetarray.splice(index, howmany, elements[0], elements[1], elements[2], ...);
Nếu yếu tố được lớn (xem dưới đây để biết những gì "lớn "có nghĩa là cho các trình duyệt khác nhau), bạn có thể nhận được lỗi" Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá "mà không cần đệ quy vì nội dung của nó sẽ được tải lên ngăn xếp cho cuộc gọi hàm.
Dưới đây là một kịch bản ngắn đó chứng tỏ vấn đề này:
var elements = new Array();
for (i=0; i<126000; i++) elements[i] = 1;
try {
var arguments = [0, 0].concat(elements);
Array.prototype.splice.apply(elements, arguments);
alert("OK");
} catch (err) {
alert(err.message);
}
Sử dụng kịch bản này, "ông lớn" có nghĩa như sau:
- Chrome 19: yếu tố chứa ~ 125.000 số
- Safari 5.1 (trên Windows): các phần tử chứa ~ 65.000 số
- Firefox 12: các thành phần chứa ~ 500.000 số
- Opera 11.61: các phần tử chứa ~ 1.000.000 số
Và người chiến thắng là: Internet Explorer 8 để thay đổi! Nó có thể sử dụng hết bộ nhớ hệ thống, trước khi cuộc gọi chức năng này thất bại.
Một mặt lưu ý: Firefox và Opera thực sự ném một (hữu dụng hơn) thông báo lỗi khác nhau: Function.prototype.apply: argArray quá lớn
+1 cho bài đăng thú vị – pixelbobby
Bạn chưa hiểu những gì bạn đang nhìn thấy . Điều gì đã xảy ra là bạn có một hàm đệ quy, tức là một hàm gọi chính nó (hoặc gọi một hàm khác gọi hàm đầu tiên) có thể do tai nạn. – Ben
(liên quan) http://stackoverflow.com/questions/6602864/stack-and-heap-in-v8-javascript –