来源

阿里-技术-1面

我的回答

  • 刚开始内存泄露少的时候,没什么影响,到后面,会频繁的进行Full GC。
  • 面试官:那CPU的表现是怎样的呢?
    我:CPU使用率会很高,因为现在的垃圾回收器一般是使用的并行回收,会使用到多个CPU。

更完美的答案

  • 刚开始内存泄露少
    刚开始内存泄露少,没什么影响。

  • 频繁full gc+cpu利用率高
    但是内存泄露多的时候,会频繁的进行Full GC,这就会导致JVM对外部请求的响应速度变慢,并且CPU的使用率会很高,因为GC的时候,一般是使用并行回收,会使用到多个CPU。

  • OOM
    再进一步发展,通过频繁的Full GC,也无法回收内存来分配空间给新创建的对象的时候,就会出现内存溢出OOM。

  • 如何排查
    如果是在OOM之前发现了问题,可以使用jmap导出内存快照,然后查看里面有哪些常驻内存的对象,可以根据对象的大小进行查看,也可以根据对象的数量进行查看,初步排查大对象或者大量的相同的对象的泄露导致的问题。
    如果是在OOM之后发现了问题,可以通过在测试环境找问题,启动JVM前,要把发生OOM时导出内存快照这个参数启动,其实我们的生产环境都可以无脑把这个参数加上。然后对核心接口,经常访问的接口进行压测,然后找出内存泄露的对象。
    找到可疑对象之后,再在代码里面排查,重点排查的代码是上一个迭代发布的功能所涉及到的代码,因为产生内存泄露问题的代码,一般是在上个迭代开发出来的。

欢迎大家在评论区一起交流、指正

04-19 03:57