Khi xuất khẩu chức năng Haskell được gọi từ C, khi nào rác của Haskell được thu thập? Nếu C sở hữu main
thì không có cách nào để dự đoán cuộc gọi tiếp theo trong Haskell. Câu hỏi này đặc biệt thích hợp khi chạy Haskell đơn luồng hoặc không có GC song song.Khi nào bộ thu gom rác chạy khi gọi Haskell xuất từ C?
Trả lời
Khi bạn khởi tạo thời gian chạy ghc
, bạn có thể vượt qua rts cờ để nó qua argc và argv like so:
RtsConfig conf = defaultRtsConfig;
conf.rts_opts_enabled = RtsOptsAll;
hs_init_ghc(&argc, &argv, conf);
này cho phép bạn set options, ví dụ sửa chữa một kích thước heap tối đa nhỏ hơn hoặc sử dụng một thuật toán nén trên vườn ươm để giảm bớt phân bổ. Hơn nữa, lưu ý có một GC nhàn rỗi có khoảng thời gian có thể được thiết lập (hoặc vô hiệu hóa), và nếu bạn liên kết thời gian chạy luồng, mà nên chạy hay không bạn đã bao giờ mang lại một cuộc gọi Haskell.
Sửa: Tôi đã không thực sự thực hiện thí nghiệm để xác minh những điều sau đây, nhưng nếu chúng ta nhìn vào source of hs_init_ghc chúng ta thấy rằng nó khởi xử lý tín hiệu, bao gồm các nội timer handlers mà trả lời trên SIGVTALRM
và thực sự nó cũng bắt đầu thời gian, mà các cuộc gọi (trên POSIX) timer_create
mà nên ném những tín hiệu trên khoảng thời gian đều đặn. Đổi lại, điều này định kỳ nên "thức dậy" RTS cho dù có bất cứ điều gì xảy ra hay không, điều này có nghĩa là nó sẽ chạy GC nhàn rỗi cho dù hệ thống có quay trở lại Haskell từ C. Nhưng một lần nữa, tôi chỉ đọc mã và bình luận, không tự mình thử nghiệm.
Bạn dường như đang ở trên một câu trả lời "câu hỏi cũ". Bất kỳ lý do cụ thể, hoặc là bạn chỉ trong tâm trạng? – dfeuer
@dfeuer mất ngủ và cưỡng bách thường xuyên vượt qua tôi để cố gắng giảm tỷ lệ câu hỏi chưa được trả lời của chúng tôi. – sclv
@sclv Tôi gần như đã sẵn sàng chấp nhận câu trả lời này, nhưng thịt của câu hỏi của tôi vẫn còn: khi nào GC thực sự chạy? Nó chỉ là "khi có phân bổ" ở bên Haskell hay cái gì đó? –
- 1. Khi nào để thu gom rác
- 2. Khi nào bộ thu gom rác net hoạt động?
- 3. Thu gom rác khi biên dịch sang C
- 4. Elasticsearch không khả dụng khi đổ bộ thu gom rác?
- 5. Bộ thu gom rác có gọi là Dispose() không?
- 6. Khi nào đối tượng thu gom rác trong python?
- 7. Buộc thu gom rác của mảng, C#
- 8. đế và bộ thu gom rác Đi
- 9. Thu gom rác trễ?
- 10. Thu gom rác trong Perl
- 11. Thu gom rác thủ công bằng Python
- 12. Thông báo thu gom rác thải?
- 13. Tự động thu gom rác trong tiêu chuẩn C++?
- 14. Ràng buộc Lua với C++ và thu gom rác
- 15. Buộc thu gom rác thải
- 16. Thu gom rác java trong hộp thoại
- 17. Thu gom rác Java G1 trong sản xuất
- 18. Thu gom rác - các nút gốc
- 19. JRuby - Cách khởi động bộ thu gom rác?
- 20. Thông báo Thu gom Rác Bỏ lỡ
- 21. Buộc thu gom rác đầy đủ khi chiếm đóng bộ nhớ vượt quá ngưỡng nhất định
- 22. Cách yêu cầu thu gom rác JVM (không phải từ mã) khi chạy từ dòng lệnh của Windows
- 23. làm thế nào để ức chế R thu gom rác khi chuyển các đối tượng đến C/C++?
- 24. Có phải rò rỉ bộ nhớ nếu bộ thu gom rác chạy bất thường?
- 25. Việc thu gom rác có xảy ra ngay lập tức sau khi Hashmap.remove() được gọi không?
- 26. Bộ nhớ có bị xóa trước khi thu gom rác không?
- 27. Thời gian thu gom rác cực dài
- 28. Tham khảo chéo và thu gom rác
- 29. tham chiếu nội bộ ngăn chặn việc thu gom rác
- 30. Phát hiện xem bộ thu gom rác đã được gọi (.Net)
Nếu bạn lo lắng về việc xuất khẩu hoặc xuất khẩu cụ thể của nước ngoài, bạn có thể thêm ['performGC'] (http://hackage.haskell.org/package/base-4.7.0.2/docs/System-Mem.html #v: performGC) trước khi trả về 'Addr'. – Cirdec
@Cirdec What 'Addr'? –
IIRC, bộ sưu tập rác sẽ có cơ hội chạy mỗi khi mã Haskell phân bổ thứ gì đó. Nếu chương trình của bạn thường xuyên gọi vào Haskell, điều này là đủ. Nếu không, nếu bạn lo lắng về việc giữ lại bộ nhớ Haskell quá nhiều thời gian, bạn có thể kích hoạt GC gọi 'performGC' từ C. – chi