面试题——JVM

一、JVM的内存模型

JVM内存分配

  1. 方法区:被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据。被Java虚拟机描述为堆的一个逻辑部分。习惯是也叫它永久代。
  2. 栈:栈分为java虚拟机栈和本地方法栈(底层是C语言写的)。
  3. 堆:堆被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例。堆区是gc的主要区域,通常情况下分为两个区块新生代和老年代,比例是1:2。更细一点新生代又分为Eden区,主要放新创建对象,From survivor 和 To survivor 保存gc后幸存下的对象,默认情况下各自占比 8:1:1。
  4. 程序计数器:当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。线程私有的。

二、GC回收算法以及回收策略

2.1 回收算法

分代收集:
在这里插入图片描述
复制算法:效率高,需要内存容量大,比较耗内存。
标记清除:效率低,会产生碎片。
标记整理:效率低速度慢,需要移动数据,但不会产生碎片。

2.2 回收策略

  1. 对象优先在堆的Eden区分配
  2. 大对象直接进入老年代
  3. 长期存活的对象直接进入老年代

三、判断对象是否存活(GC对象的判定方法)

引用计数法:给每一个对象设置一个引用计数器,引用对象时,计数器 +1,引用失效时,计数器 -1,计数器为 0 时,说明对象没有被任何引用,会被垃圾回收
可达性算法:设置一个引用链对象(GC Roots)作为起点,从这个节点开始搜索,搜索走过的路径成为引用链,当一个对象到引用链对象没有任何引用链相连,说明对象是不可用的,进行垃圾回收

四、什么情况下会产生栈溢出和堆溢出

栈溢出:

  1. 无限递归循环调用。
  2. 执行了大量方法,导致线程栈空间耗尽。
  3. 方法内声明了海量局部变量。

堆溢出:

  1. 启动参数内存值设定过小。
  2. 一次从数据库取出过多数据。
  3. 代码中存在死循环和循环中产生过多重复对象实体。

五、JVM调优

使用较小的内存占用来获得较高的吞吐量或者较低的延迟。
• 内存占用:程序正常运行需要的内存大小。
• 延迟:由于垃圾收集而引起的程序停顿时间。
• 吞吐量:用户程序运行时间占用户程序和垃圾收集占用总时间的比值。

六、Java类加载过程

  1. 加载,需要完成三件事
    a. 通过一个类的全限定名获取该类的二进制流。
    b. 将该二进制流中的静态存储结构转化为方法去运行时数据结构。
    c. 在内存中生成该类的Class对象,作为该类的数据访问入口。
  2. 验证:验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机。
    四种验证:文件格式验证、元数据验证、字节码验证、符号引用验证
  3. 解析:主要完成符号引用到直接引用的转换动作。解析动作并不一定在初始化动作完成之前,也有可能在初始化之后。
  4. 初始化:初始化时类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码。

七、双亲委派机制

类加载器加载之前,先委托上级类加载器进行加载、递归此操作,如果上级类加载器没有加载,再由自己进行加载。

作用:

  1. 防止重复性加载
  2. 防止核心.class类被篡改

八、什么是类加载器?类加载器有哪些?

实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。

主要有四种类加载器:

  1. 启动类加载器:用来加载java核心类库,无法被java程序直接引用。
  2. 扩展类加载器:它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
  3. 系统类加载器:也叫应用类加载器:它根据 Java 应用的类路径来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。
  4. 用户自定义类加载器:通过继承 java.lang.ClassLoader类的方式实现。

九、Minor GC和Major GC(full GC)

  1. 当Eden区没有足够的空间进行分配时,虚拟机会执行一次Minor GC.Minor GC通常发生在新生代的Eden区,在这个区的对象生存期短,往往发生GC的频率较高,回收速度比较快;
  2. Full Gc/Major GC 发生在老年代,一般情况下,触发老年代GC的时候不会触发Minor GC,但是通过配置,可以在Full GC之前进行一次Minor GC这样可以加快老年代的回收速度。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值