JavaSE(二十三)——JVM

关于JVM相关的面试题

1. 什么是垃圾,垃圾判断的方法有哪些?

  • 在 JVM 进行垃圾回收之前,首先就是判断哪些对象是垃圾,也就是说,要判断哪些对象是可以被销毁的,其占有的空间是可以被回收的。根据 JVM 的架构划分,我们知道, 在 Java 世界中,几乎所有的对象实例都在堆中存放,所以垃圾回收也主要是针对堆来进行的。
  • 垃圾就是指那些在堆中存在的,已经“死亡"的对象,即不可能再被任何途径使用的对象。
  • 垃圾判断算法主要包括引用计数法和可达性分析法。

引用计数法
在这种算法中,假设堆中每个对象(不是引用)都有一个引用计数器。当一个对象被创建并且初始化赋值后,该对象的计数器的值就设置为 1,每当有一个地方引用它时,计数器的值就加 1,例如将对象 b 赋值给对象 a,那么 b 被引用,则将 b 引用对象的计数器累加 1。

反之,当引用失效时,例如一个对象的某个引用超过了生命周期(出作用域后)或者被设置为一个新值时,则之前被引用的对象的计数器的值就减 1。而那些引用计数为 0 的对象,就可以称之为垃圾,可以被收集。

引用计数法的实现非常简单,判定效率也很高,它很难解决对象之间相互循环引用的问题,主流Java虚拟机里面没有选用引用计数器算法来管理内存。

可达性分析法

在主流的商用程序语言(Java、c#)的主流实现中都是通过可达性分析来判定对象是否存在的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些结点开始向下搜索,搜索所经过的路径成为“引用链”,当一个对象到GC Roots没有任何引用链时,则证明此对象是不可用的。

在Java语言中,可作为GC Roots的对象包括下面几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI(即一般说的native方法)引用的对象

如下图所示,对象object 5、object 6、object 7虽然互相有关联,但是它们到GC Roots是不可达的,所以它们将会被判定为是可回收的对象。
在这里插入图片描述

2. JVM 回收算法和回收器,CMS 采用哪种回收算法,怎么解决内存碎片问题?

标记-清除算法

  • 将垃圾回收分为两个阶段:标记阶段和清除阶段
  • 在标记阶段,首先通过根节点,标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。
  • 在清除阶段,清除所有未被标记的对象。

3. JVM类加载过程

JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化

4. JVM 内存分区

java 内存通常被划分为 5 个区域:程序计数器(Program Count Register)、本地方法栈 (Native Stack)、虚拟机栈(VM Stack)、方法区(Methon Area)、堆(Heap)

在这里插入图片描述

堆(Heap):是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。

方法区(Method Area):方法区也称"永久代",它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。

虚拟机栈(JVM Stack):描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个"栈帧",用于存储局部变量表(包括参数)、操作栈、方法出口等信息。

本地方法栈(Native Stack): 与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。(栈的空间大小远远小于堆)

程序计数器(PC Register): 是最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。

5. Java虚拟机的作用

解释运行字节码程序,消除平台相关性

  • jvm 将 java 字节码解释为具体平台的具体指令。一般的高级语言如要在不同的平台上运行, 至少需要编译成不同的目标代码。而引入 JVM 后,Java 语言在不同平台上运行时不需要重新编 译。Java 语言使用模式 Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只 需生成在 Java 虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值