服务热线:
产品中心

troubleshoot之:使用JFR解决内存泄露

发布时间: 2024-05-29 19:15:49 来源:产品中心

详细信息

  虽然java有自动化的GC,但是还会有内存泄露的情况。当然java中的内存泄露跟C++中的泄露不同。

  在C++中所有被分配的内存对象都需要要程序员手动释放。但是在java中并不是特别需要这样的一个过程,一切都是由GC来自动完成的。那么是不是java中就没有内存泄露了呢?

  要回答这样的一个问题我们第一步需要界定一下什么是内存泄露。如果说有时候我们不会再使用的对象却不能被GC释放的话,那么就可以说发生了内存泄露。

  内存泄露的根本原因就是java中的对象生命周期有长有短。如果长生命周期的对象引用了短生命周期的对象,就非常有可能造成事实上的内存泄露。

  但是因为类变量hashSet还保留着对keyObject的引用,所以keyObject对象并不会被回收。

  注意,最后一行我们加了一个hashSet.remove的代码,来使用类变量hashSet。

  为什么要这样做呢?这样做是为避免JIT对代码来优化,进而影响我们对内存泄露的分析。

  Flight Recorder(JFR)主要用来记录JVM的事件,我们大家可以从这些事件中分析出内存泄露。

  可以看见我们的对象在飞行记录器期间分配了4MB的内存,然后看到整体的内存使用量是稳步上升的。

  我们何时知道会有内存泄露呢?最简单的肯定就是OutOfMemoryErrors,但是有些很隐蔽的内存泄露会导致内存使用缓步上涨,这时候就要求我们进行细致的分析。

  OldObjectSample就是对生命周期比较长的对象进行采样,我们大家可以通过研究这些对象,来检查潜在的内存泄露。

  这里我们关注一下事件浏览器中的Old Object Sample事件,我们大家可以在左下方看到事件的详情。

  lastKnownHeapUsage是heap的使用大小,从日志中我们大家可以看到这个值是一直在增加的。

  本文通过JFR和JMC的使用,介绍了如何分析内存泄露。希望我们大家能够喜欢。

  特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

  刚上市就杀疯了!续航超过1300km,仅售6.98万起,还要啥比亚迪?

  手法罕见,有人重金买通赌场多名员工配合“抽老千”赢走454万巨款,澳门警方以相当巨额诈骗罪抓8名本地嫌犯

  女儿骑车摔倒 歪倒在路上,孩子妈妈:别动 等我先录像,上秒母爱泛滥 下秒拍照比耶

  与中坚力量共成长,2024建信信托艺术大奖评委会特别奖获奖艺术家凌海鹏

  Keychron 超薄键盘新增 100% 配列,B6 Pro 海外售价 44.99 美元