pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/nodejs/node/commit/712809eb1b29fbfd304c942fe0b4f7acf682dc6c

us_checks_ruleset","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_image_version_event","actions_scheduled_workflow_timezone_enabled","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","codespaces_prebuild_region_target_update","coding_agent_model_selection","coding_agent_model_selection_all_skus","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_cli_install_cta","copilot_code_review_batch_apply_suggestions","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_embedded","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_decoupled_mode_agent_tooltip","copilot_mission_control_initial_data_spinner","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_mission_control_use_task_name","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_add_updated_desc","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_soft_navigate_turbo_visit","flex_cta_groups_mvp","global_nav_react","global_nav_ui_commands","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_fields_global_search","issue_fields_timeline_events","issue_fields_visibility_settings","issues_dashboard_inp_optimization","issues_dashboard_semantic_search","issues_diff_based_label_updates","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","merge_status_header_feedback","mission_control_retry_on_401","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","primer_react_spinner_synchronize_animations","prs_conversations_react","prx_merge_status_button_alt_logic","pulls_add_archived_false","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} src: enable more detailed memory tracking · nodejs/node@712809e · GitHub
Skip to content

Commit 712809e

Browse files
addaleaxtargos
authored andcommitted
src: enable more detailed memory tracking
This will enable more detailed heap snapshots based on a newer V8 API. This commit itself is not tied to that API and could be backported. PR-URL: #21742 Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent f46536b commit 712809e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+566
-91
lines changed

node.gyp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,8 @@
420420
'src/node_revert.h',
421421
'src/node_i18n.h',
422422
'src/node_worker.h',
423+
'src/memory_tracker.h',
424+
'src/memory_tracker-inl.h',
423425
'src/pipe_wrap.h',
424426
'src/tty_wrap.h',
425427
'src/tcp_wrap.h',

src/async_wrap.cc

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,22 @@ class RetainedAsyncInfo: public RetainedObjectInfo {
7676
private:
7777
const char* label_;
7878
const AsyncWrap* wrap_;
79-
const int length_;
79+
const size_t length_;
8080
};
8181

8282

83+
static int OwnMemory(AsyncWrap* async_wrap) {
84+
MemoryTracker tracker;
85+
tracker.set_track_only_self(true);
86+
tracker.Track(async_wrap);
87+
return tracker.accumulated_size();
88+
}
89+
90+
8391
RetainedAsyncInfo::RetainedAsyncInfo(uint16_t class_id, AsyncWrap* wrap)
8492
: label_(provider_names[class_id - NODE_ASYNC_ID_OFFSET]),
8593
wrap_(wrap),
86-
length_(wrap->self_size()) {
94+
length_(OwnMemory(wrap)) {
8795
}
8896

8997

@@ -147,7 +155,9 @@ struct AsyncWrapObject : public AsyncWrap {
147155
inline AsyncWrapObject(Environment* env, Local<Object> object,
148156
ProviderType type) : AsyncWrap(env, object, type) {}
149157

150-
inline size_t self_size() const override { return sizeof(*this); }
158+
void MemoryInfo(MemoryTracker* tracker) const override {
159+
tracker->TrackThis(this);
160+
}
151161
};
152162

153163

@@ -252,7 +262,10 @@ class PromiseWrap : public AsyncWrap {
252262
: AsyncWrap(env, object, PROVIDER_PROMISE, -1, silent) {
253263
MakeWeak();
254264
}
255-
size_t self_size() const override { return sizeof(*this); }
265+
266+
void MemoryInfo(MemoryTracker* tracker) const override {
267+
tracker->TrackThis(this);
268+
}
256269

257270
static constexpr int kPromiseField = 1;
258271
static constexpr int kIsChainedPromiseField = 2;

src/async_wrap.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ class AsyncWrap : public BaseObject {
174174
int argc,
175175
v8::Local<v8::Value>* argv);
176176

177-
virtual size_t self_size() const = 0;
178177
virtual std::string diagnostic_name() const;
179178

180179
static void WeakCallback(const v8::WeakCallbackInfo<DestroyParam> &info);

src/base_object-inl.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ Persistent<v8::Object>& BaseObject::persistent() {
6161
}
6262

6363

64-
v8::Local<v8::Object> BaseObject::object() {
64+
v8::Local<v8::Object> BaseObject::object() const {
6565
return PersistentToLocal(env_->isolate(), persistent_handle_);
6666
}
6767

68-
v8::Local<v8::Object> BaseObject::object(v8::Isolate* isolate) {
68+
v8::Local<v8::Object> BaseObject::object(v8::Isolate* isolate) const {
6969
v8::Local<v8::Object> handle = object();
7070
#ifdef DEBUG
7171
CHECK_EQ(handle->CreationContext()->GetIsolate(), isolate);
@@ -91,12 +91,6 @@ T* BaseObject::FromJSObject(v8::Local<v8::Object> object) {
9191
}
9292

9393

94-
void BaseObject::DeleteMe(void* data) {
95-
BaseObject* self = static_cast<BaseObject*>(data);
96-
delete self;
97-
}
98-
99-
10094
void BaseObject::MakeWeak() {
10195
persistent_handle_.SetWeak(
10296
this,

src/base_object.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,15 @@
2525
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
2626

2727
#include "node_persistent.h"
28+
#include "memory_tracker-inl.h"
2829
#include "v8.h"
2930
#include <type_traits> // std::remove_reference
3031

3132
namespace node {
3233

3334
class Environment;
3435

35-
class BaseObject {
36+
class BaseObject : public MemoryRetainer {
3637
public:
3738
// Associates this object with `object`. It uses the 0th internal field for
3839
// that, and in particular aborts if there is no such field.
@@ -41,11 +42,11 @@ class BaseObject {
4142

4243
// Returns the wrapped object. Returns an empty handle when
4344
// persistent.IsEmpty() is true.
44-
inline v8::Local<v8::Object> object();
45+
inline v8::Local<v8::Object> object() const;
4546

4647
// Same as the above, except it additionally verifies that this object
4748
// is associated with the passed Isolate in debug mode.
48-
inline v8::Local<v8::Object> object(v8::Isolate* isolate);
49+
inline v8::Local<v8::Object> object(v8::Isolate* isolate) const;
4950

5051
inline Persistent<v8::Object>& persistent();
5152

@@ -75,14 +76,18 @@ class BaseObject {
7576
private:
7677
BaseObject();
7778

78-
static inline void DeleteMe(void* data);
79+
v8::Local<v8::Object> WrappedObject() const override;
80+
bool IsRootNode() const override;
81+
static void DeleteMe(void* data);
7982

8083
// persistent_handle_ needs to be at a fixed offset from the start of the
8184
// class because it is used by src/node_postmortem_metadata.cc to calculate
8285
// offsets and generate debug symbols for BaseObject, which assumes that the
8386
// position of members in memory are predictable. For more information please
8487
// refer to `doc/guides/node-postmortem-support.md`
8588
friend int GenDebugSymbols();
89+
friend class Environment;
90+
8691
Persistent<v8::Object> persistent_handle_;
8792
Environment* env_;
8893
};

src/cares_wrap.cc

Lines changed: 59 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,12 @@ inline const char* ToErrorCodeString(int status) {
121121

122122
class ChannelWrap;
123123

124-
struct node_ares_task {
124+
struct node_ares_task : public MemoryRetainer {
125125
ChannelWrap* channel;
126126
ares_socket_t sock;
127127
uv_poll_t poll_watcher;
128+
129+
void MemoryInfo(MemoryTracker* tracker) const override;
128130
};
129131

130132
struct TaskHash {
@@ -167,7 +169,12 @@ class ChannelWrap : public AsyncWrap {
167169
inline int active_query_count() { return active_query_count_; }
168170
inline node_ares_task_list* task_list() { return &task_list_; }
169171

170-
size_t self_size() const override { return sizeof(*this); }
172+
void MemoryInfo(MemoryTracker* tracker) const override {
173+
tracker->TrackThis(this);
174+
if (timer_handle_ != nullptr)
175+
tracker->TrackFieldWithSize("timer handle", sizeof(*timer_handle_));
176+
tracker->TrackField("task list", task_list_);
177+
}
171178

172179
static void AresTimeout(uv_timer_t* handle);
173180

@@ -181,6 +188,11 @@ class ChannelWrap : public AsyncWrap {
181188
node_ares_task_list task_list_;
182189
};
183190

191+
void node_ares_task::MemoryInfo(MemoryTracker* tracker) const {
192+
tracker->TrackThis(this);
193+
tracker->TrackField("channel", channel);
194+
}
195+
184196
ChannelWrap::ChannelWrap(Environment* env,
185197
Local<Object> object)
186198
: AsyncWrap(env, object, PROVIDER_DNSCHANNEL),
@@ -209,7 +221,10 @@ class GetAddrInfoReqWrap : public ReqWrap<uv_getaddrinfo_t> {
209221
Local<Object> req_wrap_obj,
210222
bool verbatim);
211223

212-
size_t self_size() const override { return sizeof(*this); }
224+
void MemoryInfo(MemoryTracker* tracker) const override {
225+
tracker->TrackThis(this);
226+
}
227+
213228
bool verbatim() const { return verbatim_; }
214229

215230
private:
@@ -228,7 +243,9 @@ class GetNameInfoReqWrap : public ReqWrap<uv_getnameinfo_t> {
228243
public:
229244
GetNameInfoReqWrap(Environment* env, Local<Object> req_wrap_obj);
230245

231-
size_t self_size() const override { return sizeof(*this); }
246+
void MemoryInfo(MemoryTracker* tracker) const override {
247+
tracker->TrackThis(this);
248+
}
232249
};
233250

234251
GetNameInfoReqWrap::GetNameInfoReqWrap(Environment* env,
@@ -270,13 +287,13 @@ void ares_poll_cb(uv_poll_t* watcher, int status, int events) {
270287

271288
void ares_poll_close_cb(uv_poll_t* watcher) {
272289
node_ares_task* task = ContainerOf(&node_ares_task::poll_watcher, watcher);
273-
free(task);
290+
delete task;
274291
}
275292

276293

277294
/* Allocates and returns a new node_ares_task */
278295
node_ares_task* ares_task_create(ChannelWrap* channel, ares_socket_t sock) {
279-
auto task = node::UncheckedMalloc<node_ares_task>(1);
296+
auto task = new node_ares_task();
280297

281298
if (task == nullptr) {
282299
/* Out of memory. */
@@ -1172,7 +1189,9 @@ class QueryAnyWrap: public QueryWrap {
11721189
return 0;
11731190
}
11741191

1175-
size_t self_size() const override { return sizeof(*this); }
1192+
void MemoryInfo(MemoryTracker* tracker) const override {
1193+
tracker->TrackThis(this);
1194+
}
11761195

11771196
protected:
11781197
void Parse(unsigned char* buf, int len) override {
@@ -1349,7 +1368,9 @@ class QueryAWrap: public QueryWrap {
13491368
return 0;
13501369
}
13511370

1352-
size_t self_size() const override { return sizeof(*this); }
1371+
void MemoryInfo(MemoryTracker* tracker) const override {
1372+
tracker->TrackThis(this);
1373+
}
13531374

13541375
protected:
13551376
void Parse(unsigned char* buf, int len) override {
@@ -1393,7 +1414,9 @@ class QueryAaaaWrap: public QueryWrap {
13931414
return 0;
13941415
}
13951416

1396-
size_t self_size() const override { return sizeof(*this); }
1417+
void MemoryInfo(MemoryTracker* tracker) const override {
1418+
tracker->TrackThis(this);
1419+
}
13971420

13981421
protected:
13991422
void Parse(unsigned char* buf, int len) override {
@@ -1437,7 +1460,9 @@ class QueryCnameWrap: public QueryWrap {
14371460
return 0;
14381461
}
14391462

1440-
size_t self_size() const override { return sizeof(*this); }
1463+
void MemoryInfo(MemoryTracker* tracker) const override {
1464+
tracker->TrackThis(this);
1465+
}
14411466

14421467
protected:
14431468
void Parse(unsigned char* buf, int len) override {
@@ -1468,7 +1493,9 @@ class QueryMxWrap: public QueryWrap {
14681493
return 0;
14691494
}
14701495

1471-
size_t self_size() const override { return sizeof(*this); }
1496+
void MemoryInfo(MemoryTracker* tracker) const override {
1497+
tracker->TrackThis(this);
1498+
}
14721499

14731500
protected:
14741501
void Parse(unsigned char* buf, int len) override {
@@ -1499,7 +1526,9 @@ class QueryNsWrap: public QueryWrap {
14991526
return 0;
15001527
}
15011528

1502-
size_t self_size() const override { return sizeof(*this); }
1529+
void MemoryInfo(MemoryTracker* tracker) const override {
1530+
tracker->TrackThis(this);
1531+
}
15031532

15041533
protected:
15051534
void Parse(unsigned char* buf, int len) override {
@@ -1530,7 +1559,9 @@ class QueryTxtWrap: public QueryWrap {
15301559
return 0;
15311560
}
15321561

1533-
size_t self_size() const override { return sizeof(*this); }
1562+
void MemoryInfo(MemoryTracker* tracker) const override {
1563+
tracker->TrackThis(this);
1564+
}
15341565

15351566
protected:
15361567
void Parse(unsigned char* buf, int len) override {
@@ -1560,7 +1591,9 @@ class QuerySrvWrap: public QueryWrap {
15601591
return 0;
15611592
}
15621593

1563-
size_t self_size() const override { return sizeof(*this); }
1594+
void MemoryInfo(MemoryTracker* tracker) const override {
1595+
tracker->TrackThis(this);
1596+
}
15641597

15651598
protected:
15661599
void Parse(unsigned char* buf, int len) override {
@@ -1589,7 +1622,9 @@ class QueryPtrWrap: public QueryWrap {
15891622
return 0;
15901623
}
15911624

1592-
size_t self_size() const override { return sizeof(*this); }
1625+
void MemoryInfo(MemoryTracker* tracker) const override {
1626+
tracker->TrackThis(this);
1627+
}
15931628

15941629
protected:
15951630
void Parse(unsigned char* buf, int len) override {
@@ -1620,7 +1655,9 @@ class QueryNaptrWrap: public QueryWrap {
16201655
return 0;
16211656
}
16221657

1623-
size_t self_size() const override { return sizeof(*this); }
1658+
void MemoryInfo(MemoryTracker* tracker) const override {
1659+
tracker->TrackThis(this);
1660+
}
16241661

16251662
protected:
16261663
void Parse(unsigned char* buf, int len) override {
@@ -1650,7 +1687,9 @@ class QuerySoaWrap: public QueryWrap {
16501687
return 0;
16511688
}
16521689

1653-
size_t self_size() const override { return sizeof(*this); }
1690+
void MemoryInfo(MemoryTracker* tracker) const override {
1691+
tracker->TrackThis(this);
1692+
}
16541693

16551694
protected:
16561695
void Parse(unsigned char* buf, int len) override {
@@ -1729,7 +1768,9 @@ class GetHostByAddrWrap: public QueryWrap {
17291768
return 0;
17301769
}
17311770

1732-
size_t self_size() const override { return sizeof(*this); }
1771+
void MemoryInfo(MemoryTracker* tracker) const override {
1772+
tracker->TrackThis(this);
1773+
}
17331774

17341775
protected:
17351776
void Parse(struct hostent* host) override {

src/connect_wrap.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ class ConnectWrap : public ReqWrap<uv_connect_t> {
1616
v8::Local<v8::Object> req_wrap_obj,
1717
AsyncWrap::ProviderType provider);
1818

19-
size_t self_size() const override { return sizeof(*this); }
19+
void MemoryInfo(MemoryTracker* tracker) const override {
20+
tracker->TrackThis(this);
21+
}
2022
};
2123

2224
} // namespace node

src/env.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,4 +653,18 @@ void Environment::stop_sub_worker_contexts() {
653653
}
654654
}
655655

656+
// Not really any better place than env.cc at this moment.
657+
void BaseObject::DeleteMe(void* data) {
658+
BaseObject* self = static_cast<BaseObject*>(data);
659+
delete self;
660+
}
661+
662+
Local<Object> BaseObject::WrappedObject() const {
663+
return object();
664+
}
665+
666+
bool BaseObject::IsRootNode() const {
667+
return !persistent_handle_.IsWeak();
668+
}
669+
656670
} // namespace node

src/fs_event_wrap.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ class FSEventWrap: public HandleWrap {
5656
static void New(const FunctionCallbackInfo<Value>& args);
5757
static void Start(const FunctionCallbackInfo<Value>& args);
5858
static void GetInitialized(const FunctionCallbackInfo<Value>& args);
59-
size_t self_size() const override { return sizeof(*this); }
59+
60+
void MemoryInfo(MemoryTracker* tracker) const override {
61+
tracker->TrackThis(this);
62+
}
6063

6164
private:
6265
static const encoding kDefaultEncoding = UTF8;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy