2015-08-05 17 views
5

Khi ứng dụng của chúng tôi chạy trong một thời gian, ví dụ, chạy hàng giờ, sbcl sẽ ném ngoại lệ đã cạn kiệt heap.scbl ngoại lệ Heap cạn kiệt trong quá trình thu gom rác

Heap exhausted during garbage collection: 1968 bytes available, 2128 requested. 
Gen StaPg UbSta LaSta LUbSt Boxed Unboxed LB LUB !move Alloc Waste Trig WP GCs Mem-age 
    0:  0  0  0  0  0  0  0  0  0  0  0 5368709 0 0 0.0000 
    1:  0  0  0  0  0  0  0  0  0  0  0 5368709 0 0 0.0000 
    2:  0  0  0  0  0  0  0  0  0  0  0 5368709 0 0 0.0000 
    3: 101912 101913  0  0 19362 20536  0  0  0 162867456 554752 102714709 0 1 1.4405 
    4: 130984 131071  0  0 29240 18868  0  0 25 191196152 5854216 128537781 14785 1 0.6442 
    5: 75511 81013  0  0 16567 17127 92 99 36 132974568 5818392 2000000 16565 0 0.0000 
    6:  0  0  0  0 7949 1232  0  0  0 37605376  0 2000000 7766 0 0.0000 
    Total bytes allocated = 524643552 
    Dynamic-space-size bytes = 536870912 
GC control variables: 
    *GC-INHIBIT* = true 
    *GC-PENDING* = true 
    *STOP-FOR-GC-PENDING* = false 
fatal error encountered in SBCL pid 3281(tid 3067845440): 
Heap exhausted, game over. 

Welcome to LDB, a low-level debugger for the Lisp runtime environment. 
ldb> 

Bất kỳ đề xuất nào?

+3

Gợi ý: không xả hết đống. Dường như bạn có một số rò rỉ bộ nhớ, i. e. đang nắm giữ những thứ để chúng không thể được thu gom rác. – Svante

+1

Tôi thỉnh thoảng chạy vào cùng một vấn đề và nó không phải là xác định do đó tôi đã (chưa) không thể gửi một lỗi báo cáo hoặc tìm lỗi trên một phần của tôi. Nhưng mô hình phổ biến mà tôi gặp phải là tôi phân bổ rất nhiều bộ nhớ để sử dụng trong thời gian ngắn. Vì SBCL sử dụng [thu gom rác thế hệ] {http://www.sbcl.org/manual/#History-and-Implementation-of-SBCL}, điều này có thể là do thanh toán bù trừ kém của các thế hệ cao hơn. Vì vậy, bạn có thể muốn buộc các hàm shortliving với việc sử dụng mem cao vào các chủ đề riêng biệt vì điều này giải quyết được vấn đề cho tôi như sau khi một luồng chết mem sẽ được giải phóng. – Sim

+1

một giải pháp khác có thể là 'sbcl --dynamic-space-size ' – Sim

Trả lời

1

SBCL không cho phép bạn phân bổ nhiều hơn (sb-ext:dynamic-space-size) byte trên heap. Ở đây bạn có kích thước mặc định là 512MB (536870912 byte) và chương trình Lisp đã sử dụng gần số tiền đó khi nó cố gắng thực hiện một phân bổ khác.

Bạn có thể tăng gấp đôi số lượng vùng trống có sẵn lên 1024MB bằng cách khởi động SBCL với kích thước khoảng trống 1024. Tuy nhiên, như một số nhận xét đã chỉ ra, có thể có rò rỉ bộ nhớ. thời gian hệ thống đang chạy, vì vậy, điều này sẽ chỉ cung cấp thời gian tạm nghỉ.

Chuẩn (room t) Chuẩn hàm gọi Lisp thường có thể giúp gỡ lỗi này, nếu bạn gọi nó theo định kỳ.

Mã nâng cao hơn như thế này http://dwim.hu/darcsweb/darcsweb.cgi?r=HEAD%20hu.dwim.debug;a=headblob;f=/source/path-to-root.lisp#l42 được khai thác trong bản đồ phân bổ bên trong SB-VM có thể giảm nhiều ánh sáng hơn và SBCL có hồ sơ thống kê, http://www.sbcl.org/manual/#Statistical-Profiler hỗ trợ báo cáo phân bổ.

+0

Bạn có thể chỉ ra các ví dụ về việc sử dụng trình biên dịch SBCL không? Tôi dường như không thể có được bất kỳ đầu ra đáng kể nào từ nó. Tôi đang sử dụng Fiveam và CLOS và chạy vào vấn đề tương tự như người hỏi. –