发布网友 发布时间:2024-10-21 10:41
共1个回答
热心网友 时间:2024-11-19 01:46
当以服务器端渲染模式运行的Web应用的Node.js进程遇到内存泄漏问题时,通常我们能够观察到注意到频繁的内存峰值和pod重启,如下图Dynatrace工具所示:
分析内存泄漏问题的关键是在不同的时间点收集多个内存转储(MemoryDump),并比较每个收集之间的对象增长,例如在Pod重新启动后不久和内存饱和之前不久。
可以在Chrome中从浏览器开发工具>内存(应选择堆快照)>加载进行MemoryDump的搜集和加载操作。
在不同的时间段内进行MemoryDump创建之后,就能够使用嵌入式比较工具快速识别两个时间点之间增长最多的对象。
使用Chrome检查工具,可以连接到远程目标并实时观察内存使用情况。如果内存泄漏问题可以在本地重现,那么可以按照对运行在本地的Storefront进行调试。
在调试模式下运行Node.js应用程序,访问chrome://inspect,如果在端口转发中配置了localhost:9229,那么此刻应该能够看到应用程序并对其进行调试。
在JSStorefront应用程序中导致内存泄漏的一种最常见的错误是是订阅事件而不在组件被销毁后取消订阅。下面是一个防止这种内存泄漏的示例——关键在于检查代码并确保在ngOnDestroy()中取消任何事件订阅。
当使用EventService并忘记从事件源Observable注销时,也会发生同样的情况。任何时候使用事件服务,都应该使用register()返回的拆卸函数(teardown)来取消注册。
SSRCaching在SSR模式下运行的JSStorefront应用程序中改善内存消耗的最强大工具之一是SSR缓存,有两种方法:
不推荐的做法:直接在服务器上缓存渲染的SSR页面。在生产环境中不建议这样做,因为它不能很好地扩展,并且最终需要比不启用SSR缓存时消耗更多的内存。
推荐的做法:在CDN上缓存渲染的SSR页面。这可以提高SSR应用的性能,因为它将减少访问SSR服务器的请求数量,同时将预渲染页面的存储到专门为此目的构建的服务器上。
原文:https://juejin.cn/post/7098674170044612622