不断学习,做更好的自己!💪

【Android -- 面试】复习指南之 JVM_JVM
Jvm 中考察频率较高的内容有:Jvm 内存区域的划分、GC 机制和类加载机制。

1. Java内存模型

Jvm 内存区域是如何划分的?
内存区域划分:

  • 程序计数器:当前线程的字节码执行位置的指示器,线程私有。
  • Java虚拟机栈:描述的Java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧,存储着局部变量、操作数栈、动态链接和方法出口等,线程私有。
  • 本地方法栈:本地方法执行的内存模型,线程私有。
  • Java堆:所有对象实例分配的区域。
  • 方法区:所有已经被虚拟机加载的类的信息、常量、静态变量和即时编辑器编译后的代码数据。

Jvm 内存模型是怎么样的?

  • Java规定所有变量的内存都需要存储在主内存。
  • 每个线程都有自己的工作内存,线程中使用的所有变量以及对变量的操作都基于工作内存,工作内存中的所有变量都从主内存读取过来的。
  • 不同线程间的工作内存无法进行直接交流,必须通过主内存完成。
    【Android -- 面试】复习指南之 JVM_java_02
    主内存和工作内存之间的交互协议,即变量如何从主内存传递到工作内存、工作内存如何将变量传递到主内存,Java内存模型定义了8种操作来完成,并且每一种操作都是原子的,不可再分的。

String s1 = "abc"和String s2 = new String(“abc”)的区别,生成对象的情况

  • 指向方法区:"abc"是常量,所以它会在方法区中分配内存,如果方法区已经给"abc"分配过内存,则s1会直接指向这块内存区域。
  • 指向Java堆:new String(“abc”)是重新生成了一个Java实例,它会在Java堆中分配一块内存。
    所以s1和s2的内存地址肯定不一样,但是内容一样。

2. GC机制

如何判断对象可回收?
判断一个对象可以回收通常采用的算法是引用几算法和可达性算法。由于互相引用导致的计数不好判断,Java 采用的可达性算法。

可达性算法的思路是:通过一些列被成为 GC Roots 的对象作为起始点,自上往下从这些起点往下搜索,搜索所有走过的路径称为引用链,如果一个对象没有跟任何引用链相关联的时候,则证明该对象不可用,所以这些对象就会被判定为可以回收。

可以被当作GC Roots的对象包括:

  • Java虚拟机栈中的引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法中JNI引用的对象

GC的常用算法?

  • 标记 - 清除:首先标记出需要回收的对象,标记完成后统一回收所有被标记的对象。容易产生碎片空间。
  • 复制算法:它将可用的内存分为两块,每次只用其中的一块,当需要内存回收的时候,将存活的对象复制到另一块内存,然后将当前已经使用的内存一次性回收掉。需要浪费一半的内存。
  • 标记 - 整理:让存活的对象向一端移动,之后清除边界外的内存。
  • 分代搜集:根据对象存活的周期,Java堆会被分为新生代和老年代,根据不同年代的特性,选择合适的GC收集算法。

Minar GC和Full GC的区别?

  • Minar GC:频率高、针对新生代。
  • Full GC:频率低、发生在老年代、通常会伴随一次Minar GC和速度慢。

说一下四种引用以及他们的区别?

  • 强引用:强引用还在,垃圾搜集器就不会回收被引用的对象。
  • 软引用:对于软引用关联的对象,在系统发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。
  • 弱引用:被若引用关联的对象只能存活到下一次GC之前。
  • 虚引用:为对象设置虚引用的目的仅仅是为了GC之前收到一个系统通知。

3. 类加载

类加载的过程?
类加载的过程可以分为:

  • 加载:将类的全限定名转化为二进制流,再将二进制流转化为方法区中的类型信息,从而生成一个Class对象。
  • 验证:对类的验证,包括格式、字节码、属性等。
  • 准备:为类变量分配内存并设置初始值。
  • 解析:将常量池的符号引用转化为直接引用。
  • 初始化:执行类中定义的Java程序代码,包括类变量的赋值动作和构造函数的赋值。
  • 使用
  • 卸载

只有加载、验证、准备、初始化和卸载的这个五个阶段的顺序是确定的。

类加载的机制,以及为什么要这样设计?
类加载的机制是双亲委派模型。大部分Java程序需要使用的类加载器包括:

  • 启动类加载器:由C++语言实现,负责加载Java中的核心类。
  • 扩展类加载器:负责加载Java扩展的核心类之外的类。
  • 应用程序类加载器:负责加载用户类路径上指定的类库。

【Android -- 面试】复习指南之 JVM_加载_03