fix: GC 统计随 run 边界复位,bench GC 列逐文件独立

This commit is contained in:
2026-09-26 12:19:23 +00:00
parent 30cc50aa70
commit bc6c13cff4
4 changed files with 30 additions and 6 deletions
+5 -1
View File
@@ -1607,6 +1607,7 @@ fn in_run_collection_keeps_live_addresses_stable() {
// 第一轮执行期收集:o 及其 epoch 子引用晋升 session。
vm.maybe_collect_in_run();
assert!(vm.session_gc_stats().total_collections >= 1, "第一轮收集应执行");
let o = global_prop_opt(&vm, "o").expect("o 应挂在 global");
let o_ptr = o.as_js_object_ptr();
assert!(unsafe { (*o_ptr).is_session_epoch() }, "o 晋升后应为 session 对象");
@@ -1627,8 +1628,11 @@ fn in_run_collection_keeps_live_addresses_stable() {
.expect("run2");
// run 边界清空执行状态:churn 局部(t 数组与 50 个对象)自此不可达。
vm.run(&Arc::new(compile("0"))).expect("run3");
// 统计按 run 复位:run 边界后只认第二轮计数,记录前值作增量基准。
let before = vm.session_gc_stats().total_collections;
vm.maybe_collect_in_run();
assert!(vm.session_gc_stats().total_collections >= 2, "两轮收集均应执行");
assert!(vm.session_gc_stats().total_collections >= 1, "第二轮收集应执行");
assert!(vm.session_gc_stats().total_collections > before, "两轮收集均应执行");
assert_eq!(global_prop_opt(&vm, "o").expect("o").as_js_object_ptr(), o_ptr, "存活对象地址不变");
assert_eq!(
+15
View File
@@ -558,6 +558,21 @@ impl Vm {
// per-run 指标(ic_hit_rate)跨文件累积,报告失真。
self.profiling.ic_hits.set(0);
self.profiling.ic_misses.set(0);
// GC 统计同属执行期状态:池化 Vm 跨 run 复用,不清零则 per-run
// 指标(gc_trigger_count)跨文件累积,报告失真。
let gc = &mut self.gc_state.session_gc;
gc.total_collections = 0;
gc.total_bytes_freed = 0;
gc.total_objects_scanned = 0;
gc.total_objects_live = 0;
gc.total_objects_dead = 0;
gc.last_collection_objects_scanned = 0;
gc.last_collection_objects_live = 0;
gc.last_collection_objects_dead = 0;
gc.last_collection_bytes_freed = 0;
gc.last_collection_duration_us = 0;
gc.max_collection_duration_us = 0;
gc.min_collection_duration_us = u64::MAX;
}
/// 轻量重置:清空执行状态并回收 epoch 内存,但保留 session 字符串与 builtin。