Opened 4 years ago
Closed 3 years ago
#1540 closed task (fixed)
Used heap reported by memory-statistics is too big after heap resize
Reported by: | megane | Owned by: | megane |
---|---|---|---|
Priority: | minor | Milestone: | 5.3 |
Component: | core libraries | Version: | 5.0.0 |
Keywords: | gc heap memory | Cc: | |
Estimated difficulty: | medium |
Description
The reported used heap just after heap resize seems to be total_allocated + last_heap
.
I would expect the value to be 2 * total_allocated
. In the code below this means (/ total-allocated used)
should be close to 0.5
.
The actual used memory as repoted by top
indicate that the problem is just with the reported used value; there's no phantom objects on the heap.
Here's code that I used to test. The report is from C4, but the results are similar with C5.
(cond-expand (chicken-5 (import (chicken base) (chicken gc) (chicken blob))) (else (begin))) (define stop-megs 400) (define stop-before-resize? #t) ; #f -> stop just after resize (define (heap-ref stats) (vector-ref stats 0)) (define (used-ref stats) (vector-ref stats 1)) (let ([l '()] [total-alloc 0] [stats (memory-statistics)]) (define last-heap (heap-ref stats)) (let lp () (let* ([cur (memory-statistics)] [bytes (max 500 (inexact->exact (floor (* .5 (- (heap-ref cur) (used-ref cur))))))] [cur-used (used-ref cur)] [cur-heap (heap-ref cur)]) (unless (or (and (< (* stop-megs 1000 1000) cur-used) (and stop-before-resize? (< cur-heap (+ cur-used bytes)))) (< (* 2 stop-megs 1000 1000) cur-used)) ;; alloc (set! l (cons (make-blob bytes) l)) (set! total-alloc (+ bytes total-alloc)) (let* ([stats-after (memory-statistics)]) (print) (print "heap - used = "(- (heap-ref cur) (used-ref cur))) (print "ALLOC " bytes " expected used: " (+ (used-ref stats-after) bytes) " diff: " (- (used-ref stats-after) (+ (used-ref cur) bytes))) (print "used / heap: " (used-ref stats-after) " / " (heap-ref stats-after) " total-alloc: " total-alloc) (print "(/ total-alloc used) = " (* 1.0 (/ total-alloc (used-ref stats-after)))) (unless (= last-heap (heap-ref stats-after)) (set! last-heap (heap-ref stats-after)) (print "#################### Heap resized ####################")) (if (and (not stop-before-resize?) (not (= (heap-ref cur) (heap-ref stats-after))) (< (* stop-megs 1000 1000) cur-used)) 'stop (lp)))))) (print "\nSTOP") (let ([cur (memory-statistics)]) (print "used / heap: " (used-ref cur) " / " (heap-ref cur) " total-alloc: " total-alloc) (print "(/ total-alloc used) = " (* 1.0 (/ total-alloc (used-ref cur))) )) (read) (print (length l))) ;;; (define stop-before-resize? #f): ;; heap - used = 696 ;; ALLOC 500 expected used: 402653572 diff: 84 ;; used / heap: 402653072 / 402653184 total-alloc: 200922244 ;; (/ total-alloc used) = 0.498995929677149 ;; ;; heap - used = 160 ;; ALLOC 500 expected used: 603980700 diff: 201326676 ;; used / heap: 603980200 / 805306368 total-alloc: 200922744 ;; (/ total-alloc used) = 0.332664454894382 ;; #################### Heap resized #################### ;; ;; STOP ;; used / heap: 603980008 / 805306368 total-alloc: 200922744 ;; (/ total-alloc used) = 0.332664560645524 ;; 133 ;; top shows: ;; 804724 400360 5716 S 0.0 1.2 0:02.29 gctest ;;; (define stop-before-resize? #t): ;; ... ;; heap - used = 696 ;; ALLOC 500 expected used: 402653572 diff: 84 ;; used / heap: 402653072 / 402653184 total-alloc: 200922244 ;; (/ total-alloc used) = 0.498995929677149 ;; ;; STOP ;; used / heap: 402652880 / 402653184 total-alloc: 200922244 ;; (/ total-alloc used) = 0.49899616761713 ;; 132 ;; top shows: ;; 411504 400212 5548 S 0.0 1.2 0:02.19 gctest
Change History (4)
comment:1 Changed 4 years ago by
Milestone: | 5.1 → 5.2 |
---|
comment:2 Changed 4 years ago by
Milestone: | 5.2 → 5.3 |
---|
comment:3 Changed 4 years ago by
Owner: | set to megane |
---|---|
Priority: | not urgent at all → minor |
Status: | new → assigned |
Type: | defect → task |
This might have been caused by the faulty heap size calculation in memory-statistics
. I'll check if it was.
comment:4 Changed 3 years ago by
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Seems to work now. memory-statistics
returns semi-space sizes correctly.
Most likely fixed by 126a315f1ffba0bd33709c05132063affddee266.
Getting ready for 5.1, moving tickets which won't make it in to 5.2.