2016-08-02 16 views
8

Câu hỏi này tương tự như one I recently asked about LLVM.V8 có gặp sự cố không nếu nó không thể cấp phát bộ nhớ? Điều này có làm hỏng toàn bộ quá trình không?

V8 phân bổ đối tượng JavaScript trên vùng lưu trữ được quản lý theo cách thủ công, bộ nhớ được lấy cuối cùng từ mmap/VirtualAlloc (trên Linux/Windows). Tuy nhiên, đối với cấu trúc dữ liệu nội bộ của nó, V8 uses C++ standard containers such as std::vector. Nếu các vùng chứa này cần phân bổ bộ nhớ, nhưng không thể, chúng thường ném std::bad_alloc.

Tuy nhiên, V8 is compiled with -fno-exceptions. Nếu không thể sử dụng ngoại lệ, V8 sẽ xử lý tình huống mà cấu trúc dữ liệu nội bộ không thể cấp phát bộ nhớ như thế nào? Nó có bị hỏng không? Nếu vậy, điều này có làm giảm bất kỳ quá trình nào nhúng V8 không?

+0

Không, trình duyệt của tôi sử dụng "V8" cũng như nút node.js của tôi, theo như tôi thấy, các sự cố xảy ra khi vùng chứa ứng dụng xuất hiện. –

+1

Xem chủ đề này: https://groups.google.com/forum/#!topic/v8-users/n-dbQX1AvTM. BTW, ngay cả hướng dẫn kiểu Google C++ nói "Chúng tôi không sử dụng ngoại lệ C++" https://google.github.io/styleguide/cppguide.html#Exceptions –

+3

@VladislavIvanishin chỉ vì [legacy code] (http: // stackoverflow /2/5184115/google-c-style-hướng dẫn-không-ngoại lệ-quy tắc-stl) – jaggedSpire

Trả lời

5

Nói chung ngay cả khi mã của bạn được biên soạn với -fno-exceptions (sau đó new sẽ không ném std::bad_alloc nhưng nó sẽ trở lại nullptr thay) tiêu chuẩn C++ libstdc thư viện ++ được biên soạn với những ngoại lệ sau đó new vẫn sẽ ném std::bad_alloc khi bạn đang cạn kiệt bộ nhớ.

Điều đó nói rằng, nghiêm túc, khi bạn sắp hết bộ nhớ bị sập càng nhanh càng tốt (thường xuyên hơn không) điều tốt nhất bạn có thể làm. Nếu bạn cần một số loại độ tin cậy nào đó thì sẽ dễ dàng hơn để có một quá trình theo dõi sẽ khởi động lại ứng dụng của bạn.

V8 nào? Rõ ràng là họ quá tải nhà điều hành new và khi phân bổ không thành công (malloc() vẫn trả về NULL, tất nhiên) họ gọi hàm đặc biệt để xử lý các điều kiện bộ nhớ thấp. Nó đổ một số thông tin gỡ lỗi, báo cáo lỗi này (bạn có thể có một trình xử lý lỗi tùy chỉnh) và sau đó (nếu trình xử lý lỗi trả về) gọi FATAL() để thoát khỏi ứng dụng.

Duyệt mã nguồn tại api.cc on GitHub. Từ mã, chỉ cần:

Khi V8 không thể cấp phát bộ nhớ FatalProcessOutOfMemory được gọi. Trình xử lý lỗi OOM mặc định được gọi và thực thi được dừng lại.

+1

_Obently họ quá tải 'new' operator_ - bạn có biết nơi trong đoạn mã này quá tải nhà điều hành được thực hiện? – user200783

+0

Cấp phát cơ sở cho các lớp _internal_ nằm trong allocator.h. Ở đó bạn cũng tìm thấy NewArray() được sử dụng trong lớp Vector của chính chúng (cùng một hành vi, gọi FatalProcessOutOfMemory() nếu malloc() trả về null). –

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