aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2025-05-07 00:00:12 -0400
committerGitHub <noreply@github.com>2025-05-07 04:00:12 +0000
commitba8f9232017266d24f170f371d56a5bc8259bf59 (patch)
treee1711077285c38a2a40b0fe220c94846072ef5ee /components/script
parente9f364ef51b067192c67c9aaab936151fa577ed5 (diff)
downloadservo-ba8f9232017266d24f170f371d56a5bc8259bf59.tar.gz
servo-ba8f9232017266d24f170f371d56a5bc8259bf59.zip
Various memory measurement improvements (#36834)
The two significant changes here are 1) a commit that frees memory used to perform memory reporting once the reporting is complete, 2) memory reporting for the system font service. There are various other commits that remove `#[ignore_malloc_size_of]` attributes for data that we are now able to measure, but they do not significantly change our measurements when testing servo.org. Testing: Comparing the output of about:memory on servo.org. --------- Signed-off-by: Josh Matthews <josh@joshmatthews.net>
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/bindings/cell.rs7
-rw-r--r--components/script/dom/element.rs2
-rw-r--r--components/script/dom/htmlimageelement.rs8
-rw-r--r--components/script/dom/htmllinkelement.rs2
-rw-r--r--components/script/dom/htmlscriptelement.rs7
-rw-r--r--components/script/dom/htmlstyleelement.rs2
6 files changed, 17 insertions, 11 deletions
diff --git a/components/script/dom/bindings/cell.rs b/components/script/dom/bindings/cell.rs
index 6c987270911..7e7e752bc0c 100644
--- a/components/script/dom/bindings/cell.rs
+++ b/components/script/dom/bindings/cell.rs
@@ -10,6 +10,7 @@ pub(crate) use std::cell::{Ref, RefCell, RefMut};
#[cfg(feature = "refcell_backtrace")]
pub(crate) use accountable_refcell::{Ref, RefCell, RefMut, ref_filter_map};
+use malloc_size_of::{MallocConditionalSizeOf, MallocSizeOfOps};
#[cfg(not(feature = "refcell_backtrace"))]
pub(crate) use ref_filter_map::ref_filter_map;
@@ -24,6 +25,12 @@ pub(crate) struct DomRefCell<T> {
value: RefCell<T>,
}
+impl<T: MallocConditionalSizeOf> MallocConditionalSizeOf for DomRefCell<T> {
+ fn conditional_size_of(&self, ops: &mut MallocSizeOfOps) -> usize {
+ self.value.borrow().conditional_size_of(ops)
+ }
+}
+
// Functionality specific to Servo's `DomRefCell` type
// ===================================================
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index b2168846fad..7f38e55fb14 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -179,7 +179,7 @@ pub struct Element {
/// <https://dom.spec.whatwg.org/#concept-element-is-value>
#[no_trace]
is: DomRefCell<Option<LocalName>>,
- #[ignore_malloc_size_of = "Arc"]
+ #[conditional_malloc_size_of]
#[no_trace]
style_attribute: DomRefCell<Option<Arc<Locked<PropertyDeclarationBlock>>>>,
attr_list: MutNullableDom<NamedNodeMap>,
diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs
index adff445ae1c..e0c8e9ef726 100644
--- a/components/script/dom/htmlimageelement.rs
+++ b/components/script/dom/htmlimageelement.rs
@@ -97,6 +97,7 @@ enum ParseState {
AfterDescriptor,
}
+#[derive(MallocSizeOf)]
pub(crate) struct SourceSet {
image_sources: Vec<ImageSource>,
source_size: SourceSizeList,
@@ -111,13 +112,13 @@ impl SourceSet {
}
}
-#[derive(Clone, Debug, PartialEq)]
+#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
pub struct ImageSource {
pub url: String,
pub descriptor: Descriptor,
}
-#[derive(Clone, Debug, PartialEq)]
+#[derive(Clone, Debug, MallocSizeOf, PartialEq)]
pub struct Descriptor {
pub width: Option<u32>,
pub density: Option<f64>,
@@ -145,7 +146,7 @@ struct ImageRequest {
parsed_url: Option<ServoUrl>,
source_url: Option<USVString>,
blocker: DomRefCell<Option<LoadBlocker>>,
- #[ignore_malloc_size_of = "Arc"]
+ #[conditional_malloc_size_of]
#[no_trace]
image: Option<Arc<Image>>,
#[no_trace]
@@ -162,7 +163,6 @@ pub(crate) struct HTMLImageElement {
pending_request: DomRefCell<ImageRequest>,
form_owner: MutNullableDom<HTMLFormElement>,
generation: Cell<u32>,
- #[ignore_malloc_size_of = "SourceSet"]
source_set: DomRefCell<SourceSet>,
last_selected_source: DomRefCell<Option<USVString>>,
#[ignore_malloc_size_of = "promises are hard"]
diff --git a/components/script/dom/htmllinkelement.rs b/components/script/dom/htmllinkelement.rs
index db5c14af450..51aa6bee286 100644
--- a/components/script/dom/htmllinkelement.rs
+++ b/components/script/dom/htmllinkelement.rs
@@ -98,7 +98,7 @@ pub(crate) struct HTMLLinkElement {
#[no_trace]
relations: Cell<LinkRelations>,
- #[ignore_malloc_size_of = "Arc"]
+ #[conditional_malloc_size_of]
#[no_trace]
stylesheet: DomRefCell<Option<Arc<Stylesheet>>>,
cssom_stylesheet: MutNullableDom<CSSStyleSheet>,
diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs
index 9d0ca807748..777b30d1e63 100644
--- a/components/script/dom/htmlscriptelement.rs
+++ b/components/script/dom/htmlscriptelement.rs
@@ -281,19 +281,18 @@ pub(crate) enum ScriptType {
pub(crate) struct CompiledSourceCode {
#[ignore_malloc_size_of = "SM handles JS values"]
pub(crate) source_code: Stencil,
- #[ignore_malloc_size_of = "Rc is hard"]
+ #[conditional_malloc_size_of = "Rc is hard"]
pub(crate) original_text: Rc<DOMString>,
}
-#[derive(JSTraceable)]
+#[derive(JSTraceable, MallocSizeOf)]
pub(crate) enum SourceCode {
- Text(Rc<DOMString>),
+ Text(#[conditional_malloc_size_of] Rc<DOMString>),
Compiled(CompiledSourceCode),
}
#[derive(JSTraceable, MallocSizeOf)]
pub(crate) struct ScriptOrigin {
- #[ignore_malloc_size_of = "Rc is hard"]
code: SourceCode,
#[no_trace]
url: ServoUrl,
diff --git a/components/script/dom/htmlstyleelement.rs b/components/script/dom/htmlstyleelement.rs
index 194b81729fb..aed08b7bcf6 100644
--- a/components/script/dom/htmlstyleelement.rs
+++ b/components/script/dom/htmlstyleelement.rs
@@ -34,7 +34,7 @@ use crate::stylesheet_loader::{StylesheetLoader, StylesheetOwner};
#[dom_struct]
pub(crate) struct HTMLStyleElement {
htmlelement: HTMLElement,
- #[ignore_malloc_size_of = "Arc"]
+ #[conditional_malloc_size_of]
#[no_trace]
stylesheet: DomRefCell<Option<Arc<Stylesheet>>>,
cssom_stylesheet: MutNullableDom<CSSStyleSheet>,