노드에서 메모리 누수 문제를 해결하는 방법은 무엇입니까? 다음 문서는 모든 사람에게 도움이 될 수 있는 노드 메모리 누수 문제 해결 경험을 요약합니다.
in Nodejs
服务端开发的场景中,内存泄漏
은 확실히 가장 짜증나는 문제입니다.
그러나 프로젝트가 계속해서 개발되고 반복되는 한 엔지니어의 가장 기본적이고 핵심적인 역량이 나타날 것입니다. 内存泄漏
的问题绝对不可避免,只是出现的时间早晚而已。所以系统性掌握有效的 内存泄漏
排查方法是一名Nodejs
메모리 누수
를 해결한 사례를 바탕으로 처리 아이디어를 공유하겠습니다.
문제 설명
内存泄漏
的案例分享一下我的处理思路。问题描述
2022 Q4
2022년 4분기
어느 날 R&D 사용자 그룹에서 우리 R&D 플랫폼을 사용할 수 없다고 보고했습니다. 액세스했지만 다수의 비정상적인 작업이 백그라운드에서 완료되지 않았습니다.
첫 번째 반응은 메모리 누수가 있을 수 있다는 것입니다. 다행히 grafana
에서 모니터링(prometheus
+ grafana
)으로 서비스가 연결되어 있습니다. 모니터링 패널을 살펴보니 10시 이후에는 메모리가 계속 증가하고 한 번도 다운되지 않았으며 명백한 데이터 유출이 있는 것으로 나타났습니다. [추천 관련 튜토리얼: nodejs 동영상 튜토리얼]prometheus
+ grafana
),在grafana
监控面板中发现在 10.00 后内存一直在涨没有下来过出现了明显的数据泄漏。【相关教程推荐:nodejs视频教程】
说明:
process memory
:rss
(Resident Set Size),进程的常驻内存大小。heapTotal
: V8 堆的总大小。heapUsed
: V8 堆已使用的大小。external
: V8 堆外的内存使用量。在
Nodejs
中可以调用全局方法process.memoryUsage()
获取这些数据其中heapTotal
和heapUsed
是 V8 堆的使用情况,V8 堆是Node.js
中 JavaScript 对象存储的地方。而external
则表示非 V8 堆中分配的内存,例如 C++ 对象。rss
则是进程所有内存的使用量。一般看监控数据的时候重点关注heapUsed
的指标就行了
内存泄漏类型
内存泄漏主要分为:
- 全局性泄漏
- 局部性泄漏
其实不管是全局性内存泄漏还是局部性的内存泄漏,要做的都是尽可能缩小排除范围。
全局性内存泄漏
全局性内容泄漏出现一般高发于:中间件
与组件
中,这种类型的内存泄漏排查起来也是最简单的。
很遗憾我在 2022 Q4
中遇到的内存泄漏不属于这个类型,所以还得按照局部性泄漏的思路进行分析。
二分法排查
这种类型我就不讲其它科学的分析方法了,这种情况下我认为使用二分法排查是最快的。
流程流程:
先注释一半的代码(减少一半
中间件
、组件
、或其它公用逻辑的使用)随便选择一个接口或新写一个测试接口进行压测
如果出现内存泄漏,那么泄漏点就在当前使用的代码之中,若没有泄漏则泄漏点出现在
然后一直循环往复上述流程大约 20 ~ 60 min 一定可以定位到内存泄漏的详细位置
2020 年的时候我在做基于
Nuxt
SSR 应用时,上线前压测发现应用内存泄漏,判断定为全局性的泄漏之后,采用二分法排查大约花了 30min 就成功定位了问题。
当时泄漏的原因是我们在服务端使用axios
导致的泄漏,后来统一axios
相关的全换成node-fetch
后就解决了,从此换上了axios PDST
后来绝对不会在Node
服务中使用axios
了
局部性内存泄漏排查
大多数内存泄漏的情况都是局部性的泄漏,泄漏点可能存在与某个中间件
、某个接口
、某个异步任务
中,由于这样的特性它的排查难度也较大。这种情况都会做 heapdump

🎜설명: 🎜🎜
프로세스 메모리
:rss
(상주 세트 크기), 프로세스의 상주 메모리 크기입니다.heapTotal
: V8 힙의 전체 크기입니다.heapUsed
: 사용된 V8 힙의 크기입니다.외부
: V8 외부 힙 메모리 사용량.Nodejs
에서 전역 메서드process.memoryUsage()
를 호출하여 이러한 데이터를 얻을 수 있습니다. 그중heapTotal
및heapUsed
는Node.js
의 JavaScript 객체가 저장되는 V8 힙의 사용법입니다. 그리고external
은 C++ 객체와 같이 V8이 아닌 힙에 할당된 메모리를 나타냅니다.rss
는 프로세스의 총 메모리 사용량입니다. 일반적으로 모니터링 데이터를 볼 때heapUsed
표시기🎜
메모리 누수 유형에 집중하세요. h2 >🎜메모리 누수는 크게 🎜
- 글로벌 누수
- 로컬 누수
🎜사실 전역 메모리 누수인지 아닌지로 나누어집니다. 또는 로컬 누수 메모리 누수의 경우 제외 범위를 최대한 좁히면 됩니다. 🎜
전역 메모리 누수
🎜전역 콘텐츠 누수는 일반적으로 다음에서 발생합니다. 미들웨어
구성요소
, 이러한 유형의 메모리 누수 역시 문제 해결이 가장 쉽습니다. 🎜🎜안타깝게도 제가 2022 Q4
에서 겪은 메모리 누수는 이 유형에 속하지 않기 때문에 로컬 누수라는 개념에 따라 분석해야 합니다. 🎜이분법 문제 해결
🎜이 유형에 대한 다른 과학적 분석 방법에 대해서는 이야기하지 않을 것입니다. 이 경우에는 이분법 프랑스어 문제 해결을 사용하는 것이 좋습니다. 가장 빠릅니다. 🎜🎜프로세스 흐름: 🎜
- 🎜첫 번째 주석 코드 절반(
미들웨어
절반 줄이기) >, 컴포넌트
또는 기타 공개 로직 사용)🎜
- 🎜인터페이스를 선택하거나 스트레스 테스트를 위한 새 테스트 인터페이스를 작성하세요🎜
- 🎜If memory Leak이 나타나면 현재 사용 중인 코드에 누수 지점이 나타납니다. 누수 지점이 없으면 🎜
- 🎜에 나타납니다. 그런 다음 위의 과정을 약 20~60분 동안 계속 반복하면 됩니다. Location🎜
🎜2020년 Nuxt
기반 SSR 애플리케이션 작업을 하던 중, 가기 전에 스트레스 테스트를 했는데요. 온라인에서 애플리케이션 메모리 누수를 발견했는데, 이는 글로벌 누수로 판단됐다. 이후 이분법을 사용해 문제를 찾는 데 약 30분 정도 걸렸다.
당시 유출이 발생한 이유는 서버 측에서 axios
를 사용했기 때문이었습니다. 나중에 axios
를 통합하여 node- fetch
그 후에 해결되었고, 그 이후로는 node
에서 axios
를 사용하지 않을 것입니다. 더 이상 서비스하지 마세요🎜
로컬 메모리 누수 문제 해결
🎜대부분의 메모리 누수는 로컬 누수이며 누수 지점은 특정 미들웨어
절반 줄이기) >, 컴포넌트
또는 기타 공개 로직 사용)🎜Nuxt
기반 SSR 애플리케이션 작업을 하던 중, 가기 전에 스트레스 테스트를 했는데요. 온라인에서 애플리케이션 메모리 누수를 발견했는데, 이는 글로벌 누수로 판단됐다. 이후 이분법을 사용해 문제를 찾는 데 약 30분 정도 걸렸다. 당시 유출이 발생한 이유는 서버 측에서
axios
를 사용했기 때문이었습니다. 나중에 axios
를 통합하여 node- fetch
그 후에 해결되었고, 그 이후로는 node
에서 axios
를 사용하지 않을 것입니다. 더 이상 서비스하지 마세요🎜미들웨어
, 특정 인터페이스
및 특정 비동기 작업
은 이러한 특성으로 인해 문제를 해결하기가 더 어렵습니다. 이 경우 분석을 위해 heapdump
가 수행됩니다. 🎜여기서는 이 경우에 대한 내 아이디어를 주로 다음 단락인 heapdump
的详细说明我放在下个段落,
Heap Dump
:堆转储, 后面部分都使用heapdump
表示,做heapdump
的工具和教程也非常多比如:chrome、vscode、heapdump 这个开源库。我用的 heapdump 库做的网上教程非常多这里不展开了。
局部性内存泄漏排查需要一定的内存泄漏排查经验,每次遇到都把它当成对自己的一次磨砺,这样的经验积累多了以后排查内存泄漏问题会越来越快。
1. 确定内存泄漏出现的时间范围
这一点非常重要,明确了这一点可以大幅度缩小排查范围。
经常会出现这种情况,这个迭代做了A、B、C 三个功能,压测时或上线后出现了内存泄漏。那么就可以直接锁定,内存泄漏发生小这三个新的功能之中。这种情况下就不需要非常麻烦的去生产做 heapdump
我们在本地通过一些工具就可以很轻松的分析定位出内存泄漏点。
由于我们 20年Q4
Heap Dump
에 설명하겠습니다. 다음 부분은 모두heapdump
를 사용한다는 것은 Chrome, vscode 및 heapdump 오픈 소스 라이브러리와 같이heapdump
를 수행하기 위한 많은 도구와 튜토리얼이 있다는 것을 의미합니다. 내가 사용하는 힙 덤프 라이브러리에 대한 온라인 자습서가 많이 있지만 여기서는 다루지 않겠습니다.이 더 빠릅니다.
1. 메모리 누수가 발생하는 시간 범위를 결정합니다
- 이를 아는 것은 조사 범위를 크게 좁힐 수 있습니다.
이러한 반복에는 A, B, C의 세 가지 기능이 있으며 스트레스 테스트 중 또는 온라인 상태가 된 후에 메모리 누수가 발생합니다. 그런 다음 직접 잠글 수 있으며 이 세 가지 새로운 기능 중 작은 메모리 누수가 발생합니다. 이 경우heapdump
를 수행하기 위해 프로덕션으로 이동할 필요가 없습니다. 일부 도구를 통해 로컬에서 메모리 누수 지점을 쉽게 분석하고 찾을 수 있습니다.node
添加--expose-gc
,这个参数会向全局注入gc()
方法,方便手动触发 GC 获取更准确的堆快照
数据 - 这里我加入了两个接口并带上了自己的专属权限,
- 手动触发 GC
- 打印堆快照
-
heapdump
- 项目启动后第一次打印快照数据
- 内存上涨 100M 后:先触发 GC,再第二次打印堆快照数据
- 内存接近临界时再次触发 GC 然后打印堆快照
采集堆快照数据时需要特别注意的一些点!
- 在
heapdump
时 Node 服务会中断,根据当时服务器内存大小这个时间会在 2 ~ 30min 左右。在生产环境做heapdump
需要和运维一起制定合理的策略。我在这里是使用了主、备两个pod
, 当主pod
停掉之后,业务请求会通过负载均衡到备用pod
由此保障生产业务的正常进行。(这个过程必定是一个与运维密切配合的过程,毕竟heapdump
玩抽还需要通过他们拿到服务器中堆快照
文件)- 上述接近临界点打印快照只是一个模糊的描述,如果你试过就知道等非常接近临界点再打印内存快照就打印不出来了。所以接近这个度需要自己把握。
- 做至少 3 次
heapdump
(实际上为了拿到最详细的数据我是做了 5 次)
3. 结合监控面板的数据进行分析
需要你的应用服务接入监控,我这里应用是使用prometheus
+ grafana
做的监控, 主要监控服务的以下指标
-
QPS
(每秒请求访问量) ,请求状态,及其访问路径 -
ART
(平均接口响应时间) 及其访问数据 -
NodeJs
版本 -
Actice Handlers
(句柄) -
Event Loop Lag
(事件滞后) - 服务进程重启次数
- CPU 使用率
- 内存使用:
rss
、heapTotal
、heapUsed
、external
、heapAvailableDetail
只有
heapdump
数据是不够的,heapdump
数据非常晦涩,就算在可视化工具的加持下也难以准确定位问题。这个时候我是结合了grafana
的一些数据一起看。
我的分析处理结果
由于当时的对快照数据丢失了,我这里模拟一下当时的场景。
1、通过 grafana
监控面看看到内存一直在涨一直下不来,但同时我也注意到,服务中的句柄
2020년 4분기
의 특수한 상황으로 인해 메모리 누수가 처음 발견된 시기는 대략적으로 1월에만 확인할 수 있었습니다. 이번 달에 우리는 또 다른 주요 버전 반복을 거쳤습니다. 이러한 기능과 인터페이스를 하나씩 확인하면 비용이 매우 높을 것입니다.
따라서 추가 분석을 위해서는 더 많은 데이터를 결합해야 합니다node
는 --expose-gc
를 추가합니다. 매개변수 gc()
메서드는 보다 정확한 힙 스냅샷
데이터를 얻기 위해 GC의 수동 트리거를 용이하게 하기 위해 전역적으로 주입됩니다.🎜여기서 두 개의 인터페이스를 추가하고 가져왔습니다. 독점 권한 보유, 🎜🎜 GC 수동 실행🎜힙 스냅샷 인쇄🎜heapdump
🎜🎜프로젝트 후 처음으로 스냅샷 데이터 인쇄 시작됩니다 🎜메모리가 100M 증가한 후: 먼저 GC를 트리거한 다음 두 번째로 힙 스냅샷 데이터를 인쇄합니다.🎜메모리가 임계 수준에 가까워지면 GC를 다시 트리거한 다음 인쇄합니다. 힙 스냅샷 🎜🎜힙 스냅샷 데이터 수집 시 특별한 주의가 필요한 몇 가지 사항! 🎜🎜🎜🎜heapdump
중에 Node 서비스가 중단됩니다. 이 시간은 해당 시간의 서버 메모리 크기에 따라 약 2~30분 정도 소요됩니다. 프로덕션 환경에서heapdump
를 수행할 때는 운영 및 유지 관리와 협력하여 합리적인 전략을 개발해야 합니다. 여기서는 기본 및 백업이라는 두 개의pod
를 사용합니다. 기본pod
가 중지되면 비즈니스 요청이 백업pod
로 로드 밸런싱됩니다. . 이는 생산 작업의 정상적인 수행을 보장합니다. (이 프로세스는 운영 및 유지 관리와 긴밀하게 조화된 프로세스여야 합니다. 결국heapdump
는 이를 통해 서버에heap snapshot
파일을 가져와야 합니다)🎜 위의 임계점에 가까운 스냅샷을 인쇄하는 것은 막연한 설명일 뿐입니다. 사용해보신 분이라면 임계점에 매우 가깝게 기다렸다가 메모리 스냅샷을 인쇄하면 인쇄되지 않는다는 것을 아실 것입니다. 그러므로 이 정도에 가까워지려면 자신을 통제해야 합니다. 🎜heapdump
를 3번 이상 수행하세요(실제로 가장 자세한 데이터를 얻기 위해 5번 수행했습니다)
🎜3. 분석을 위해 모니터링 패널의 데이터를 결합합니다🎜🎜🎜모니터링에 액세스하려면 애플리케이션 서비스가 필요합니다. 여기 내 애플리케이션은 prometheus
+ grafana를 사용합니다. 코드별 모니터링>은 주로 서비스의 다음 지표 🎜🎜🎜<code>QPS
(초당 요청 방문 수), 요청 상태 및 액세스 경로🎜ART
)를 모니터링합니다. > (평균 인터페이스 응답 시간) 및 해당 액세스 데이터🎜NodeJs
버전🎜Actice 핸들러
(handle)🎜 이벤트 루프 지연
(이벤트 지연)🎜서비스 프로세스 다시 시작 횟수🎜CPU 사용량🎜메모리 사용량: rss
, heapTotal, <code>heapUsed
, external
, heapAvailableDetail
🎜 힙 덤프
만 해당 > 데이터가 충분하지 않고 heapdump
데이터가 매우 모호하며 시각화 도구를 지원하더라도 문제를 정확하게 찾기가 어렵습니다. 이때 grafana
의 일부 데이터와 함께 살펴보았습니다. 🎜
🎜나의 분석 및 처리 결과🎜🎜🎜당시 스냅샷 데이터가 유실되었기 때문에 여기서 현장을 시뮬레이션하겠습니다. 🎜🎜1. grafana
모니터링 인터페이스를 통해 메모리가 증가하고 감소하지 않는 것을 확인했습니다. 그러나 동시에 핸들
의 개수도 확인되었습니다. code> 서비스도 급등하며 하락세를 보이지 않고 있습니다. 🎜🎜🎜🎜
힙 덤프
만 해당 > 데이터가 충분하지 않고 heapdump
데이터가 매우 모호하며 시각화 도구를 지원하더라도 문제를 정확하게 찾기가 어렵습니다. 이때 grafana
의 일부 데이터와 함께 살펴보았습니다. 🎜grafana
모니터링 인터페이스를 통해 메모리가 증가하고 감소하지 않는 것을 확인했습니다. 그러나 동시에 핸들
의 개수도 확인되었습니다. code> 서비스도 급등하며 하락세를 보이지 않고 있습니다. 🎜🎜🎜🎜2. 누수가 발생한 달의 새로운 기능을 검토한 때입니다. bull
메시지 대기열 구성요소 사용으로 인해 메모리 누수가 발생했을 수 있다고 의심됩니다. 먼저 관련 애플리케이션 코드를 분석해 보았는데, 메모리 누수를 일으키는 뭔가 문제가 있다는 것을 알 수 없었습니다.
1의 핸들 누수 문제와 결합하면 bull
后需要手动的去释放某些资源,在这个时候还不太确定具体原因。
3、然后对 5 次的 heapdunmp
数据进行了分析,数据导入 chrome
对 5 次堆快照进行对比后,发现每次创建队列后 TCP、Socket、EventEmitter 的事件都没有被释放到。到这里基本可以确定是由于对 bull
的使用不规范导致的。在 bull
通常不会频繁创建队列,队列占用的系统资源并不会被自动释放,若有需要,需手动释放。
4、在调整完代码后重新进行了压测,问题解决。
Tips: Nodejs 中的
句柄
是一种指针,指向底层系统资源(如文件、网络连接等)。句柄允许 Node.js 程序访问和操作这些资源,而无需直接与底层系统交互。句柄可以是整数或对象,具体取决于 Node.js 库或模块使用的句柄类型。常见句柄
:
fs.open()
返回的文件句柄net.createServer()
返回的网络服务器句柄dgram.createSocket()
返回的 UDP socket 句柄child_process.spawn()
返回的子进程句柄crypto.createHash()
返回的哈希句柄zlib.createGzip()
返回的压缩句柄
heapdump 分析总结
通常很多人第一次拿到堆快照
数据是懵的,我也是。在看了网上无数的分析技巧结合自身实战后总结了一些比较好用的技巧,一些基础的使用教程这里就不讲了。这里主要讲数据导入 chrome
를 사용한 후 특정 리소스를 수동으로 해제해야 하는 것 같습니다. 현재로서는 구체적인 이유를 잘 모르겠습니다.
3. 그런 다음 5번의 heapdunmp
데이터를 분석하고 해당 데이터를 chrome
으로 가져온 후 5번의 힙 스냅샷을 비교한 결과 다음과 같은 사실을 발견했습니다. 각 큐 생성, TCP, Socket, EventEmitter 이벤트는 해제되지 않습니다. 현시점에서는 기본적으로 의 불규칙한 사용으로 인해 발생하는 것이 확실합니다. 대기열은 일반적으로 에서 자주 생성되지 않으며 대기열이 차지하는 시스템 리소스는 자동으로 해제되지 않습니다. 필요한 경우 수동으로 해제해야 합니다.
- 팁: Nodejs의
handle
은 기본 시스템 리소스(예: 파일, 네트워크 연결 등)를 가리키는 포인터입니다. 핸들을 사용하면 Node.js 프로그램이 기본 시스템과 직접 상호 작용하지 않고도 이러한 리소스에 액세스하고 조작할 수 있습니다. 핸들은 Node.js 라이브러리 또는 모듈에서 사용하는 핸들 유형에 따라 정수 또는 객체가 될 수 있습니다. 일반핸들
:TCP
Socket
EventEmitter
global
Comparison 视图
如果通过 Summary
视图, 不能定位到问题这时我们一般会使用 Comparison
fs.open()
반환된 파일 핸들Comparison
视图中选择两个堆快照,并在它们之间进行比较。您可以查看哪些对象在两个堆快照之间新增,哪些对象在两个堆快照之间减少,以及哪些对象的大小发生了变化。Comparison
net.createServer()
반환된 네트워크 서버 핸들
dgram.createSocket()
반환된 UDP 소켓 핸들child_process.spawn()
반환된 하위 프로세스 핸들
crypto.createHash()
반환된 해시 핸들
zlib.createGzip()
반환된 압축 핸들 heapdump 분석 요약
보통 많은 사람들이 힙 스냅샷
데이터를 처음 받으면 혼란스러워하는데, 나도 그렇습니다. 인터넷에서 수많은 분석 기술을 읽고 이를 내 실제 실습과 결합한 후 몇 가지 유용한 기술을 요약했습니다. 일부 기본 사용법 튜토리얼은 여기서 논의하지 않겠습니다. 여기서는 데이터를 chrome
으로 가져온 후 사진을 보는 방법에 대해 주로 설명합니다.
요약 보기 이 보기를 볼 때 일반적으로 보유 크기를 먼저 확인한 다음 숙련된 엔지니어는 그 안에 있는 물체의 크기와 수를 관찰하여 특정 물체의 비정상적인 수를 신속하게 판단할 수 있습니다. 이 관점에서는 자신이 정의한 일부 개체에 관심을 갖는 것 외에도 메모리 누수가 발생하기 쉬운 일부 객체에도 주의가 필요합니다. 예:
TCP
Socket
EventEmitter
글로벌
비교 보기🎜🎜요약
을 통과한 경우 보기, 문제를 찾을 수 없는 경우 일반적으로 비교
보기를 사용합니다. 이 보기를 통해 두 힙 스냅샷의 개체 수와 개체가 차지하는 메모리의 변화를 비교할 수 있습니다.
이 정보를 통해 우리는 힙에 있는 개체의 값을 판단할 수 있으며 일정 시간(특정 작업) 이후 메모리 변경 사항을 통해 일부 비정상적인 개체를 찾을 수 있습니다. 이러한 개체의 이름 속성이나 기능은 메모리 누수 조사 범위를 좁힐 수 있습니다. 🎜🎜 🎜 보기에서는 개체 간의 관계뿐 아니라 유형, 크기, 참조 횟수와 같은 개체 세부정보도 볼 수 있습니다. 이 정보를 사용하면 어떤 개체가 메모리 누수를 일으키는지 이해할 수 있습니다. 🎜🎜🎜🎜🎜🎜Containment view🎜🎜🎜에는 개체 간에 연결할 수 있는 모든 참조 관계가 표시됩니다. 각 개체는 점으로 표시되며 선으로 상위 개체와 연결됩니다. 이렇게 하면 개체 간의 계층적 관계를 확인하고 어떤 개체가 메모리 누수를 일으키는지 이해할 수 있습니다. 🎜🎜🎜🎜🎜🎜통계 보기🎜🎜🎜이 사진은 매우 간단하므로 자세히 설명하지 않겠습니다🎜🎜🎜🎜메모리 누수 시나리오
- 전역 변수: 전역 변수는 재활용되지 않습니다.
- 캐시:
lru-cache
와 같은 메모리 집약적인 타사 라이브러리를 사용하면 메모리 오류가 발생할 수 있습니다. lru-cache
存的太多就会导致内存不够用,在 Nodejs 服务中建议使用 redis
替代 lru-cache
- 句柄泄漏:调用完系统资源没有释放
- 事件监听
- 闭包
- 循环引用
总结
服务需要接入监控,方便第一时间确定问题类型
判断内存泄漏是全局性的还是局部性的
全局性内存泄漏使用二分法快速排查定位
-
局部内存泄漏
- 确定内存泄漏出现时间点,快速定位问题功能
- 采堆快照数据,至少 3 次
- 结合监控数据、堆快照数据、与出现泄漏事时间点内的新功能对内存泄漏点进行定位
遇到内存泄漏的问题不要畏惧,多积累内存泄漏问题的排查经验处理经验多了找起来就非常快了。每次解决之后做复盘总结回头再多看看 堆快照
누수 처리: 호출 후 시스템 리소스가 해제되지 않습니다.
이벤트 모니터링Closure
Loop Quote-
Summary
서비스는 다음을 수행해야 합니다. 모니터링에 연결하여 문제 유형을 처음으로 쉽게 판단할 수 있습니다🎜 🎜🎜🎜메모리 누수가 전역인지 로컬인지 확인🎜🎜🎜🎜이분법을 사용하여 전역 메모리 누수 문제를 신속하게 해결하고 찾아보세요🎜🎜🎜🎜로컬 메모리 Leaks🎜🎜🎜메모리 누수 발생 시점을 파악하고 문제를 빠르게 찾아냅니다🎜 🎜힙 스냅샷 데이터를 최소 3회 이상 수집합니다🎜🎜누수 발생 시점의 모니터링 데이터, 힙 스냅샷 데이터, 새로운 기능을 결합하여 메모리 누수 지점 찾기🎜🎜🎜🎜lru-cache
와 같은 메모리 집약적인 타사 라이브러리를 사용하면 메모리 오류가 발생할 수 있습니다. lru-cache
存的太多就会导致内存不够用,在 Nodejs 服务中建议使用 redis
替代 lru-cache
服务需要接入监控,方便第一时间确定问题类型
判断内存泄漏是全局性的还是局部性的
全局性内存泄漏使用二分法快速排查定位
局部内存泄漏
- 确定内存泄漏出现时间点,快速定位问题功能
- 采堆快照数据,至少 3 次
- 结合监控数据、堆快照数据、与出现泄漏事时间点内的新功能对内存泄漏点进行定位
遇到内存泄漏的问题不要畏惧,多积累内存泄漏问题的排查经验处理经验多了找起来就非常快了。每次解决之后做复盘总结回头再多看看 堆快照
🎜메모리 누수 문제를 겪지 마세요. 메모리 누수 문제 해결에 대한 더 많은 경험을 쌓을수록 더 쉬워집니다. 그들을 찾으려면. 각 솔루션을 마친 후 검토 요약을 수행하고 힙 스냅샷
을 다시 살펴보세요. 데이터는 관련 경험을 더 빠르게 축적하는 데 도움이 됩니다🎜🎜🎜🎜Others🎜🎜🎜🎜스트레스 테스트 도구: wrk🎜🎜🎜더 많은 노드 관련 지식을 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜
위 내용은 [경험요약] Node에서 메모리 누수 문제를 해결하는 방법은 무엇인가요? 아이디어 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

드림위버 CS6
시각적 웹 개발 도구
