jvm如何定位一个对象
1 使用手柄:如果用手柄访问它,Java桩将将一块内存划分为手柄。引用中的仓库手柄是对象外套的地址,并且手柄包含对象数据和写作数据的地址信息。
使用手柄的优点是存储在引用中的稳定手柄的地址,即当对象移动(例如,在GC垃圾组中)时,它只会更改手柄中的库数据指示器,并且参考本身不会修改。
2 使用直接指标:参考文献中存储的直接指示灯是对象的地址:直接从指示器直接访问的最大优势是快速速度,它提供了放置指示器的总体时间,但是由于经常达到对象,这些一般费用也是校正少量后的一般实施成本。
如何定位Node.js的内存泄漏
1 定位node.js内存漏洞的工具:如果您想做得好,则必须首先提高工具。故障排除时,我们仍然需要一些工具来提供帮助。
DevTool是今年年初发布的Node.js调试工具。
基于电子,Node.js和Chromium的功能已集成。
与节点检查员相比,操作更方便,并且开放时间表函数仍然相对实用,尽管它并未实时显示。
仅需要DevToolxxx.js,并且可以通过.devtoolrc自定义参数。
有关详细信息,请参见Githubheapdump + Chromedevtool,这是定位记忆泄漏的相对传统组合。
可以在代码中直接调用HeapDump以生成内存快照,然后将快照文件导入Chromedevtool进行分析。
随后的操作实际上与前者相似。
但是,该解决方案与前者之间实际上在浏览器环境中有很小的区别,因此生成的内存快照将具有某些DOM对象,这会导致一些干扰。
该解决方案是直接调用基础V8 方法,而生成的快照仅是Node.js环境中的对象。
MemWatch可以直接在代码中用于实时检测内存动态。
当发生内存泄漏时,将触发“泄漏”事件,将通过当前的堆状态,并且在HeapDump中将有效。
2 定位问题:如果使用DevTool,则可以忽略以下过程:打开Chromedevtools,输入配置文件选项卡,单击“加载”按钮,然后加载之前生成的快照。
对于内存快照,有四个视图,摘要,比较,遏制和统计数据。
前三个通常在这里使用。
在摘要视图中,我们可以看到当前快照的所有信息,以及多个快照之间的信息。
对象的构造函数显示在列表中。
您首先可以忽略包裹在括号中的对象,首先观察其他对象,然后查看它们。
以下浅色表示对象本身的大小,并且保留尺寸表示对象的大小及其相关对象,而GC通常无法实现。
在比较视图中,我们可以比较多个快照,这很有用。
如果我们比较前两个快照,则可以更快地将有问题的对象定位。
注意新,删除和三角洲。
如果它是具有内存泄漏的对象,则可能是它已在新的且未删除的对象。
在围栏视图中,我们可以查看整个GC路径,当然我们通常不会使用它。
因为扩展了摘要和比较中列出的每个项目,因此您可以看到从GCRoots到此对象的路径。
通过这些路径,您可以看到该对象的句柄所在,从而定位了问题的原因。
请注意,背景颜色为黄色,表明该对象在JavaScript中仍然具有引用,因此可能无法清除。
如果是红色,则意味着该对象在JavaScript中没有参考,但它仍然存在于内存中。
通常在DOM对象中常见。
它们的存储位置仍然不同于JavaScript中的存储位置,并且很少在Node.js中遇到它们。