Here is another use case. Basically: allocate a TEMPORARY string of 200M characters, (it's not referenced after the form is evaluated, not even in *); then allocate a vector of 200M octets. There is no exhaustion, because the 200M character string is garbage and it should be collected SILENTLY!
[pjb@despina :0.0 ~]$ sbcl --no-userinit
This is SBCL 1.4.1, an implementation of ANSI Common Lisp.
More information about SBCL is available at .
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (let ((string (make-string (* 200 1024 1024) :initial-element #\a))
(pattern "07123E1F482356C415F684407A3B8723E10B2CBBC0B8FCD6282C49D37C9C1ABC"))
(replace string pattern :start1 (- (length string) (length pattern)))
(time (search pattern string)))
Evaluation took:
2.012 seconds of real time
2.010401 seconds of total run time (2.007339 user, 0.003062 system)
99.90% CPU
8,065,801,078 processor cycles
0 bytes consed
209715136
* (let ((string (make-array (* 200 1024 1024) :element-type '(unsigned-byte 8) :initial-element (char-code #\a)))
(pattern (map '(vector (unsigned-byte 8)) 'char-code "07123E1F482356C415F684407A3B8723E10B2CBBC0B8FCD6282C49D37C9C1ABC")))
(replace string pattern :start1 (- (length string) (length pattern)))
(time (search pattern string)))
Heap exhausted during allocation: 204046336 bytes available, 209715216 requested.
Gen StaPg UbSta LaSta Boxed Unbox LB LUB !move Alloc Waste Trig WP GCs Mem-age
0: 26538 0 0 45 0 0 0 0 1405408 69152 10737418 0 0 0.0000
1: 26524 26512 0 19 2 0 25601 25608 839364224 217472 2000000 7 0 0.0000
2: 0 0 0 0 0 0 0 0 0 0 2000000 0 0 0.0000
3: 0 0 0 0 0 0 0 0 0 0 2000000 0 0 0.0000
4: 0 0 0 0 0 0 0 0 0 0 2000000 0 0 0.0000
5: 0 0 0 0 0 0 0 0 0 0 2000000 0 0 0.0000
6: 0 0 0 570 304 0 0 0 27930768 708464 2000000 553 0 0.0000
7: 875 876 0 0 0 0 0 0 0 0 2000000 0 0 0.0000
Total bytes allocated = 868700400
Dynamic-space-size bytes = 1073741824
GC control variables:
*GC-INHIBIT* = false
*GC-PENDING* = true
*STOP-FOR-GC-PENDING* = false
debugger invoked on a SB-KERNEL::HEAP-EXHAUSTED-ERROR in thread
#:
Heap exhausted (no more space for allocation).
204046336 bytes available, 209715216 requested.
PROCEED WITH CAUTION.
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-KERNEL::HEAP-EXHAUSTED-ERROR 102023168 104857608)
0] :a
* (let ((string (make-array (* 200 1024 1024) :element-type '(unsigned-byte 8) :initial-element (char-code #\a)))
(pattern (map '(vector (unsigned-byte 8)) 'char-code "07123E1F482356C415F684407A3B8723E10B2CBBC0B8FCD6282C49D37C9C1ABC")))
(replace string pattern :start1 (- (length string) (length pattern)))
(time (search pattern string)))
Evaluation took:
1.895 seconds of real time
1.889737 seconds of total run time (1.885292 user, 0.004445 system)
99.74% CPU
7,595,260,962 processor cycles
0 bytes consed
209715136
* (quit)
[pjb@despina :0.0 ~]$