Skip to content

Commit e94b866

Browse files
committed
feat: support RSPACK_DEBUG_MEMORY
1 parent 46fd27e commit e94b866

File tree

7 files changed

+146
-107
lines changed

7 files changed

+146
-107
lines changed

Cargo.lock

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 100 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -16,103 +16,107 @@ version = "0.6.1"
1616
[workspace.metadata.cargo-shear]
1717
ignored = ["swc", "rspack"]
1818
[workspace.dependencies]
19-
aho-corasick = { version = "1.1.3", default-features = false }
20-
anyhow = { version = "1.0.95", default-features = false, features = ["backtrace", "std"] }
21-
anymap = { package = "anymap3", version = "1.0.1", default-features = false, features = ["std"] }
22-
async-recursion = { version = "1.1.1", default-features = false }
23-
async-trait = { version = "0.1.84", default-features = false }
24-
atomic_refcell = { version = "0.1.13", default-features = false }
25-
base64 = { version = "0.22.1", default-features = false }
26-
base64-simd = { version = "0.8.0", default-features = false, features = ["alloc"] }
27-
bitflags = { version = "2.9.1", default-features = false }
28-
browserslist-rs = { version = "0.19.0", default-features = false }
29-
bytes = { version = "1.10.0", default-features = false }
30-
camino = { version = "1.2.1", default-features = false }
31-
cargo_toml = { version = "0.21.0", default-features = false }
32-
cfg-if = { version = "1.0.1", default-features = false }
33-
clap = { version = "4.5.41", default-features = false }
34-
color-backtrace = { version = "0.7.0", default-features = false, features = ["use-backtrace-crate"] }
35-
concat-string = { version = "1.0.1", default-features = false }
36-
cow-utils = { version = "0.1.3", default-features = false }
37-
criterion2 = { default-features = false, version = "2.0.0", features = ["async_tokio"] }
38-
css-module-lexer = { version = "0.0.15", default-features = false }
39-
dashmap = { version = "6.1.0", default-features = false }
40-
derive_more = { version = "2.0.1", default-features = false }
41-
dunce = { version = "1.0.5", default-features = false }
42-
dyn-clone = { version = "1.0.17", default-features = false }
43-
either = { version = "1.15.0", default-features = false }
44-
enum-tag = { version = "0.3.0", default-features = false }
45-
fast-glob = { version = "0.4.4", default-features = false }
46-
futures = { version = "0.3.31", default-features = false, features = ["std"] }
47-
glob = { version = "0.3.2", default-features = false }
48-
hashlink = { version = "0.10.0", default-features = false }
49-
heck = { version = "0.5.0", default-features = false }
50-
hex = { version = "0.4.3", default-features = false, features = ["std"] }
51-
indexmap = { version = "2.7.0", default-features = false }
52-
indicatif = { version = "0.17.9", default-features = false }
53-
indoc = { version = "2.0.5", default-features = false }
54-
insta = { version = "1.42.0", default-features = false }
55-
itertools = { version = "0.14.0", default-features = false, features = ["use_std"] }
56-
itoa = { version = "1.0.14", default-features = false }
57-
json = { version = "0.12.4", default-features = false }
58-
jsonc-parser = { version = "0.26.2", default-features = false, features = ["serde"] }
59-
lightningcss = { version = "1.0.0-alpha.68", default-features = false, features = ["serde"] }
60-
linked_hash_set = { version = "0.1.5", default-features = false }
61-
md4 = { version = "0.10.2", default-features = false }
62-
memchr = { version = "2.7.5", default-features = false }
19+
aho-corasick = { version = "1.1.3", default-features = false }
20+
anyhow = { version = "1.0.95", default-features = false, features = ["backtrace", "std"] }
21+
anymap = { package = "anymap3", version = "1.0.1", default-features = false, features = ["std"] }
22+
async-recursion = { version = "1.1.1", default-features = false }
23+
async-trait = { version = "0.1.84", default-features = false }
24+
atomic_refcell = { version = "0.1.13", default-features = false }
25+
base64 = { version = "0.22.1", default-features = false }
26+
base64-simd = { version = "0.8.0", default-features = false, features = ["alloc"] }
27+
bitflags = { version = "2.9.1", default-features = false }
28+
browserslist-rs = { version = "0.19.0", default-features = false }
29+
bytes = { version = "1.10.0", default-features = false }
30+
camino = { version = "1.2.1", default-features = false }
31+
cargo_toml = { version = "0.21.0", default-features = false }
32+
cfg-if = { version = "1.0.1", default-features = false }
33+
clap = { version = "4.5.41", default-features = false }
34+
color-backtrace = { version = "0.7.0", default-features = false, features = ["use-backtrace-crate"] }
35+
concat-string = { version = "1.0.1", default-features = false }
36+
cow-utils = { version = "0.1.3", default-features = false }
37+
criterion2 = { default-features = false, version = "2.0.0", features = ["async_tokio"] }
38+
css-module-lexer = { version = "0.0.15", default-features = false }
39+
dashmap = { version = "6.1.0", default-features = false }
40+
derive_more = { version = "2.0.1", default-features = false }
41+
dunce = { version = "1.0.5", default-features = false }
42+
dyn-clone = { version = "1.0.17", default-features = false }
43+
either = { version = "1.15.0", default-features = false }
44+
enum-tag = { version = "0.3.0", default-features = false }
45+
fast-glob = { version = "0.4.4", default-features = false }
46+
futures = { version = "0.3.31", default-features = false, features = ["std"] }
47+
glob = { version = "0.3.2", default-features = false }
48+
hashlink = { version = "0.10.0", default-features = false }
49+
heck = { version = "0.5.0", default-features = false }
50+
hex = { version = "0.4.3", default-features = false, features = ["std"] }
51+
indexmap = { version = "2.7.0", default-features = false }
52+
indicatif = { version = "0.17.9", default-features = false }
53+
indoc = { version = "2.0.5", default-features = false }
54+
insta = { version = "1.42.0", default-features = false }
55+
itertools = { version = "0.14.0", default-features = false, features = ["use_std"] }
56+
itoa = { version = "1.0.14", default-features = false }
57+
json = { version = "0.12.4", default-features = false }
58+
jsonc-parser = { version = "0.26.2", default-features = false, features = ["serde"] }
59+
libmimalloc-sys = { version = "*", default-features = false, features = [
60+
"extended",
61+
"v3",
62+
], package = "rspack-libmimalloc-sys" }
63+
lightningcss = { version = "1.0.0-alpha.68", default-features = false, features = ["serde"] }
64+
linked_hash_set = { version = "0.1.5", default-features = false }
65+
md4 = { version = "0.10.2", default-features = false }
66+
memchr = { version = "2.7.5", default-features = false }
6367
micromegas-perfetto = { version = "0.9.0", default-features = false }
64-
miette = { version = "7.5.0", default-features = false }
65-
mimalloc = { version = "0.2.4", package = "mimalloc-rspack", default-features = false }
66-
mime_guess = { version = "2.0.5", default-features = false, features = ["rev-mappings"] }
67-
notify = { version = "8.2.0", default-features = false }
68-
num-bigint = { version = "0.4.6", default-features = false }
69-
once_cell = { version = "1.20.2", default-features = false }
70-
oneshot = { version = "0.1.8", default-features = false, features = ["std", "async"] }
71-
owo-colors = { version = "4.0.0", default-features = false }
72-
parcel_sourcemap = { version = "2.1.1", default-features = false }
73-
paste = { version = "1.0.15", default-features = false }
74-
path-clean = { version = "1.0.1", default-features = false }
75-
pathdiff = { version = "0.2.3", default-features = false }
76-
pretty_assertions = { version = "1.4.1", default-features = false, features = ["std"] }
77-
proc-macro2 = { version = "1.0.92", default-features = false }
78-
prost = { version = "0.13", default-features = false }
79-
quote = { version = "1.0.38", default-features = false }
80-
rayon = { version = "1.10.0", default-features = false }
81-
regex = { version = "1.12.2", default-features = false }
82-
regex-syntax = { version = "0.8.5", default-features = false, features = ["std"] }
83-
regress = { version = "0.10.4", default-features = false, features = ["pattern"] }
84-
ropey = { version = "1.6.1", default-features = false }
85-
rspack_resolver = { features = ["package_json_raw_json_api", "yarn_pnp"], version = "0.6.4", default-features = false }
86-
rspack_sources = { version = "=0.4.15", default-features = false }
87-
rustc-hash = { version = "2.1.0", default-features = false }
88-
ryu-js = { version = "1.0.2", default-features = false }
89-
scopeguard = { version = "1.2.0", default-features = false }
90-
serde = { version = "1.0.225", default-features = false, features = ["derive"] }
91-
serde_json = { version = "1.0.145", default-features = false, features = ["std"] }
92-
sftrace-setup = { version = "0.1.0", default-features = false }
93-
sha2 = { version = "0.10.8", default-features = false }
94-
signal-hook = { version = "0.3.18", default-features = false, features = ["iterator"] }
95-
simd-json = { version = "0.14.3", default-features = false }
96-
smol_str = { version = "0.3.0", default-features = false }
97-
stacker = { version = "0.1.17", default-features = false }
98-
sugar_path = { version = "1.2.0", default-features = false, features = ["cached_current_dir"] }
99-
syn = { version = "2.0.95", default-features = false }
100-
termcolor = { version = "1.4.1", default-features = false }
101-
textwrap = { version = "0.16.1", default-features = false }
102-
thread_local = { version = "1.1.9", default-features = false }
103-
tokio = { version = "1.48.0", default-features = false, features = ["rt", "rt-multi-thread"] }
104-
toml = { version = "0.8.19", default-features = false, features = ["parse", "display"] }
105-
tracing = { version = "0.1.41", default-features = false, features = ["max_level_trace", "release_max_level_trace"] }
106-
tracing-subscriber = { version = "0.3.19", default-features = false, features = ["fmt", "registry"] }
107-
trybuild = { version = "1.0.101", default-features = false, features = ["diff"] }
108-
unicase = { version = "2.8.1", default-features = false }
109-
unicode-width = { version = "0.2.0", default-features = false }
110-
url = { version = "2.5.4", default-features = false }
111-
urlencoding = { version = "2.1.3", default-features = false }
112-
ustr = { package = "ustr-fxhash", version = "1.0.1", default-features = false }
113-
wasmparser = { version = "0.222.0", default-features = false }
114-
winnow = { version = "0.7.12", default-features = false, features = ["std", "simd"] }
115-
xxhash-rust = { version = "0.8.14", default-features = false }
68+
miette = { version = "7.5.0", default-features = false }
69+
mimalloc = { version = "0.2.4", package = "mimalloc-rspack", default-features = false }
70+
mime_guess = { version = "2.0.5", default-features = false, features = ["rev-mappings"] }
71+
notify = { version = "8.2.0", default-features = false }
72+
num-bigint = { version = "0.4.6", default-features = false }
73+
once_cell = { version = "1.20.2", default-features = false }
74+
oneshot = { version = "0.1.8", default-features = false, features = ["std", "async"] }
75+
owo-colors = { version = "4.0.0", default-features = false }
76+
parcel_sourcemap = { version = "2.1.1", default-features = false }
77+
paste = { version = "1.0.15", default-features = false }
78+
path-clean = { version = "1.0.1", default-features = false }
79+
pathdiff = { version = "0.2.3", default-features = false }
80+
pretty_assertions = { version = "1.4.1", default-features = false, features = ["std"] }
81+
proc-macro2 = { version = "1.0.92", default-features = false }
82+
prost = { version = "0.13", default-features = false }
83+
quote = { version = "1.0.38", default-features = false }
84+
rayon = { version = "1.10.0", default-features = false }
85+
regex = { version = "1.12.2", default-features = false }
86+
regex-syntax = { version = "0.8.5", default-features = false, features = ["std"] }
87+
regress = { version = "0.10.4", default-features = false, features = ["pattern"] }
88+
ropey = { version = "1.6.1", default-features = false }
89+
rspack_resolver = { features = ["package_json_raw_json_api", "yarn_pnp"], version = "0.6.4", default-features = false }
90+
rspack_sources = { version = "=0.4.15", default-features = false }
91+
rustc-hash = { version = "2.1.0", default-features = false }
92+
ryu-js = { version = "1.0.2", default-features = false }
93+
scopeguard = { version = "1.2.0", default-features = false }
94+
serde = { version = "1.0.225", default-features = false, features = ["derive"] }
95+
serde_json = { version = "1.0.145", default-features = false, features = ["std"] }
96+
sftrace-setup = { version = "0.1.0", default-features = false }
97+
sha2 = { version = "0.10.8", default-features = false }
98+
signal-hook = { version = "0.3.18", default-features = false, features = ["iterator"] }
99+
simd-json = { version = "0.14.3", default-features = false }
100+
smol_str = { version = "0.3.0", default-features = false }
101+
stacker = { version = "0.1.17", default-features = false }
102+
sugar_path = { version = "1.2.0", default-features = false, features = ["cached_current_dir"] }
103+
syn = { version = "2.0.95", default-features = false }
104+
termcolor = { version = "1.4.1", default-features = false }
105+
textwrap = { version = "0.16.1", default-features = false }
106+
thread_local = { version = "1.1.9", default-features = false }
107+
tokio = { version = "1.48.0", default-features = false, features = ["rt", "rt-multi-thread"] }
108+
toml = { version = "0.8.19", default-features = false, features = ["parse", "display"] }
109+
tracing = { version = "0.1.41", default-features = false, features = ["max_level_trace", "release_max_level_trace"] }
110+
tracing-subscriber = { version = "0.3.19", default-features = false, features = ["fmt", "registry"] }
111+
trybuild = { version = "1.0.101", default-features = false, features = ["diff"] }
112+
unicase = { version = "2.8.1", default-features = false }
113+
unicode-width = { version = "0.2.0", default-features = false }
114+
url = { version = "2.5.4", default-features = false }
115+
urlencoding = { version = "2.1.3", default-features = false }
116+
ustr = { package = "ustr-fxhash", version = "1.0.1", default-features = false }
117+
wasmparser = { version = "0.222.0", default-features = false }
118+
winnow = { version = "0.7.12", default-features = false, features = ["std", "simd"] }
119+
xxhash-rust = { version = "0.8.14", default-features = false }
116120

117121
allocative = { package = "rspack-allocative", version = "0.3.5", default-features = false, features = [
118122
"camino",

crates/rspack_allocator/Cargo.toml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@ tracy-client-sys = { version = "=0.26.0" }
1515

1616
[target.'cfg(target_os = "linux")'.dependencies]
1717
# Turned on `local_dynamic_tls` to avoid issue: https://github.com/microsoft/mimalloc/issues/147
18-
mimalloc = { workspace = true, features = ["local_dynamic_tls"] }
18+
libmimalloc-sys = { workspace = true, features = ["extended"] }
19+
mimalloc = { workspace = true, features = ["local_dynamic_tls"] }
1920

2021
[target.'cfg(target_os = "macos")'.dependencies]
21-
mimalloc = { workspace = true, features = ["v3"] }
22+
libmimalloc-sys = { workspace = true, features = ["extended"] }
23+
mimalloc = { workspace = true, features = ["v3"] }
2224

2325
[target.'cfg(all(not(target_os = "linux"), not(target_os = "macos"), not(target_family = "wasm")))'.dependencies]
2426
mimalloc = { workspace = true }
2527

2628
[package.metadata.cargo-shear]
27-
ignored = ["tracy-client-sys"]
29+
ignored = ["tracy-client-sys"]
30+
libmimalloc-sys = { workspace = true, features = ["extended"] }
31+
mimalloc = { workspace = true }

crates/rspack_allocator/src/lib.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,10 @@ static GLOBAL: sftrace_setup::SftraceAllocator<mimalloc::MiMalloc> =
1414
#[cfg(all(feature = "tracy-client", not(feature = "sftrace-setup")))]
1515
static GLOBAL: tracy_client::ProfiledAllocator<std::alloc::System> =
1616
tracy_client::ProfiledAllocator::new(std::alloc::System, 10); // adjust callstack_depth if needed with performance cost
17+
pub fn print_memory_stats() {
18+
#[cfg(not(any(miri, target_family = "wasm")))]
19+
#[cfg(not(feature = "sftrace-setup"))]
20+
unsafe {
21+
libmimalloc_sys::mi_stats_print(std::ptr::null_mut());
22+
}
23+
}

crates/rspack_binding_api/Cargo.toml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,14 @@ napi-derive = { workspace = true, features = ["compat-mode"] }
6262

6363
color-backtrace = { workspace = true, optional = true }
6464

65-
derive_more = { workspace = true, features = ["debug"] }
66-
futures = { workspace = true }
67-
glob = { workspace = true }
68-
heck = { workspace = true }
69-
once_cell = { workspace = true }
70-
rayon = { workspace = true }
71-
regex = { workspace = true }
65+
derive_more = { workspace = true, features = ["debug"] }
66+
futures = { workspace = true }
67+
glob = { workspace = true }
68+
heck = { workspace = true }
69+
once_cell = { workspace = true }
70+
rayon = { workspace = true }
71+
regex = { workspace = true }
72+
7273
rspack_browser = { workspace = true, optional = true }
7374
rspack_cacheable = { workspace = true }
7475
rspack_ids = { workspace = true }
@@ -127,7 +128,6 @@ serde_json = { workspace = true }
127128
swc_core = { workspace = true, default-features = false, features = ["ecma_transforms_react"] }
128129
tokio = { workspace = true, features = ["rt", "rt-multi-thread", "macros", "test-util", "tracing", "parking_lot"] }
129130
ustr = { workspace = true }
130-
131131
[package.metadata.cargo-shear]
132132
ignored = ["parking_lot", "rspack_tracing_perfetto"]
133133

crates/rspack_binding_api/src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ use rspack_core::{
114114
use rspack_error::Diagnostic;
115115
use rspack_fs::{IntermediateFileSystem, NativeFileSystem, ReadableFileSystem};
116116
use rspack_tasks::{CURRENT_COMPILER_CONTEXT, CompilerContext, within_compiler_context_sync};
117+
use rspack_util::env::should_debug_memory;
117118
use rustc_hash::FxHashMap;
118119
use swc_core::common::util::take::Take;
119120

@@ -345,6 +346,10 @@ impl JsCompiler {
345346
compiler.build().await.to_napi_result_with_message(|e| {
346347
print_error_diagnostic(e, compiler.options.stats.colors)
347348
})?;
349+
if (should_debug_memory()) {
350+
rspack_allocator::print_memory_stats();
351+
}
352+
348353
tracing::debug!("build ok");
349354
Ok(())
350355
},
@@ -381,6 +386,9 @@ impl JsCompiler {
381386
.to_napi_result_with_message(|e| {
382387
print_error_diagnostic(e, compiler.options.stats.colors)
383388
})?;
389+
if (should_debug_memory()) {
390+
rspack_allocator::print_memory_stats();
391+
}
384392
tracing::debug!("rebuild ok");
385393
Ok(())
386394
},

crates/rspack_util/src/env.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,11 @@ static RSPACK_QUERY: LazyLock<Option<String>> =
77
pub fn has_query() -> bool {
88
RSPACK_QUERY.is_some()
99
}
10+
11+
// debug memory statistics
12+
static RSPACK_DEBUG_MEMORY: LazyLock<Option<String>> =
13+
LazyLock::new(|| std::env::var("RSPACK_DEBUG_MEMORY").ok());
14+
15+
pub fn should_debug_memory() -> bool {
16+
RSPACK_DEBUG_MEMORY.is_some()
17+
}

0 commit comments

Comments
 (0)