|
From: Brett v. de S. <bv...@as...> - 2010-02-27 14:46:35
|
>
>Can you be more specific? Are you running out of memory, are the GC
>pauses too long, or what?
No, I am not running out out of memory, but after about 20-30 minutes,
I get a gc pause that is several minutes long. Also, I eventually get the error:
fatal error encountered in SBCL pid 8528(tid 46912619751744):
An mprotect call failed with ENOMEM. This probably means that the maximum amount
of separate memory mappings was exceeded. To fix the problem, either increase
the maximum with e.g. 'echo 262144 > /proc/sys/vm/max_map_count' or recompile
SBCL with a larger value for GENCGC-PAGE-BYTES in
'src/compiler/target/backend-parms.lisp'.
If I recompile with a larger value of gencgc-page-bytes, as suggested
then gc overall becomes *much* slower.
>> 1. Â Modify the garbage collector so that it gcs the older data first.
>> (that is, do generation 0, 1, 2 in the usual way, but do generations
>> 3, 4, 5 backwards).
>
>This is a non-starter, pretty much.
What about doing a gc that only does generation 5?
That is, put a switch in garbage_collect so that, if desired, it only
calls garbage_collect_generation(5,0)
>> 2. Â Is there any way to garbage collect for a specific object
>> and its descendents?
OK, I understand that there is no lisp version of free().
However, would it help the garbage collection if I applied
something like the following to my session data at the close
of a session:
(defun dereference (obj)
(cond ((consp obj)
(dereference (car obj))
(dereference (cdr obj))
(setf (car obj) nil)
(setf (cdr ojb) nil))
;; add similar actions for arrays, structs, etc.
))
Brett
|