JVM面试及深入理解(一)

Posted by YiBo on December 3, 2020

1. 前言

今年过的可真快,在家里醉生梦死

昨天开始发简历了,然后就是电话疯狂被call,也算是有一点压力了吧

明天就要面试第一家java公司了,还是挺紧张的,已经准备好被嫌弃的剔除公司门口了哈哈

先话2个小时来搞搞JVM吧

2. 面试题剖析

  1. java内存结构

    image-20201203132754949

    image-20201203134722115

  2. java heap 区分 image-20201203135701604

    看完之后其实对于零基础的我来说,是搞不清楚的,然后翻到《深入理解java虚拟机》,一看吓一跳,他这个就是人家书的目录。。。摘抄一下书中的重点吧:

    • java heap 分为 : 新生代和老年代,再细致一点有:Eden , From Survivor , To Survivor

    • 无论哪个区域,存储的仍然是对象实例,进一步划分的目的是为了更好的回收内存,或者更快的分配内存

    • heap中没有内存完成分配实例,并且heap也无法再扩展时,会抛出 OutOfMemoryError 异常,此外抛出此异常的原因还要一个:Direct Memory被频繁使用。

      Direct Memory 并不是JVM运行时数据区的一部分,受到本机总内存的限制

      出现原因:NIO类引入基于Channel和Buffer的IO方式,可以使用本地函数直接分配堆外内存,避免java heap 和 本地堆中的来回复制数据

  3. java对象的创建过程

    image-20201203150602554

​ 上图是看《深入理解java虚拟机》2.3.1 记录的要点

​ 检查 – 分配 — 设置必要信息 — 初始化 这四个步骤

​ 在分配内存环环节,会根据垃圾回收器的算法不同而采用不同的方式

  1. java对象的访问定位

    上面讲java对象创建完成后,怎么来使用呢?

    image-20201203151128848**

    image-20201203151251844

​ 俩种方式的区别:

1
2
			- 使用句柄访问:java stack中的reference存的是稳定的句柄地址,对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要修改
			- 使用直接指针访问:速度快,节省了一次指针定位的时间开销
  1. 垃圾回收器是什么

    Garbage Collection需要完成的事情:

    • 那些内存需要回收
    • 什么时候回收
    • 如何回收

    java heap 和 Method Area 中会用到GC