阿里高德电话面

  1. 自我介绍
  2. 博客的内容都包含哪些方面?
  3. JVM OOM的问题的排查思路?
    PermGen space
    原因: 说明Perm不足。Perm存放class,method相关对象,以及运行时常量对象. 如果一个应用加载了大量的class, 那么Perm区存储的信息一般会比较大.另外大量的intern String对象也会导致Perm区不断增长。 此区域大小由-XX:MaxPermSize参数进行设置. (jdk8相关参数已经改变, 这里不讨论)。

本质原因: ClassLoader.defineClass和java.lang.String.intern在大量不适宜的场景被调用.
解决方案:
方案1:使用btrace相关工具输出调用ClassLoader.defineClass栈信息, 从栈信息来追溯问题.
方案2: dump heap, 看看哪些class有异常现象(数量), String被Perm区引用的对象信息等.但这种方式不太直观,可以从String数据看看发现可疑问题,没有方案1直观

Java heap space
原因: 长生命周期的对象引用了短生命周期(应该尽快GC回收掉)的对象,最后造成一个对象已经不能在堆区分配足够空间. 注: 这种现象不能完全肯定是内存泄露, 比如: heap本身的设置的过小.

解决方案:

  1. 触发FullGC, dump live heap. 标记堆中对象数量, 重点关注可疑对象

  2. 触发FullGC, dump live heap. 标记堆中对象数量, 重点关注可疑对象

  3. 对比步骤1和步骤2 相同对象的数量和大小, 找出可疑对象一一进行排查确认。

  4. 如果步骤3依然无法明确有问题的对象, 那就多执行几次步骤1和步骤2。 在此过程中可以调整GC触发时间, 模拟真实的故障场景

  5. 看看GC后堆的大小是否增长, 如果没有不断增长, 并且持续一段较长时间, 那基本正常。

  6. 哪些区域会出现OOM。

  • 堆内存,堆内存不足是最常见的发送OOM的原因之一。
    如果在堆中没有内存完成对象实例的分配,并且堆无法再扩展时,将抛出OutOfMemoryError异常,抛出的错误信息是“java.lang.OutOfMemoryError:Java heap space”。当前主流的JVM可以通过-Xmx和-Xms来控制堆内存的大小,发生堆上OOM的可能是存在内存泄露,也可能是堆大小分配不合理。

  • Java虚拟机栈和本地方法栈,这两个区域的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务,在内存分配异常上是相同的。
    在JVM规范中,对Java虚拟机栈规定了两种异常:
    a. 如果线程请求的栈大于所分配的栈大小,则抛出StackOverFlowError错误,比如进行了一个不会停止的递归调用;
    b. 如果虚拟机栈是可以动态拓展的,拓展时无法申请到足够的内存,则抛出OutOfMemoryError错误。

  • 直接内存:直接内存虽然不是虚拟机运行时数据区的一部分,但既然是内存,就会受到物理内存的限制。在JDK1.4中引入的NIO使用Native函数库在堆外内存上直接分配内存,但直接内存不足时,也会导致OOM。

  • 方法区:随着Metaspace元数据区的引入,方法区的OOM错误信息也变成了“java.lang.OutOfMemoryError:Metaspace”

  1. 如果经过检查jvm的堆内存和栈内存都没有溢出,但是系统的可用内存却变少了,可能是什么原因导致的。
    直接内存占用过多,可能导致可用的系统内存变少,而且不影响堆内存和栈内存

  2. 根据自己的实际经验来说,造成OOM的情况都是有哪些?
    大对象过多。
    生命周期长的对象对生命周期短的对象有引用,导致生命周期短的对象无法被gc。
    Java设置的堆空间,栈空间等不太合理,导致其出现OOM。

  3. 数据库索引的存储结构?

  4. B+树这种索引结构的优势在哪?

  5. Java中classloader的作用?

  6. 什么情况下应该使用自定义类加载器?举个例子。

  7. 我面试的其他同学大部分都讲对工程项目的理解不够深入,你为什么会有这么出色表现?

  8. 你当初高考的时候为啥去河南工业大学而不是这接考西安电子科技大学?

  9. 自己的职业规划是什么?

你可能感兴趣的:(面试)