java--jvm虚拟机--重点面试题

1.简述 jvm 的内存布局
java--jvm虚拟机--重点面试题_第1张图片
JVM 中的内存布局主要分为:堆、方法区、虚拟机栈、本地方法栈、程序计数器这五个部分。其中堆和方法区是线程共享,而栈和程序计数器是每个线程都会有自己的分配空间,即
线程私有。堆是内存最大的一块,主要存放对象实例和数组;方法区主要存储已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据(运行时的常量相对于 class 文
件而已,具有动态性通过 intern 将常量放入池中)。虚拟机栈主要存放(包括)局部变量表、 操作数栈、动态链接、方法出口等信息(虚拟机栈描述的是 java 方法执行的内存模型,每
个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法调用和结束对应的是入栈和出栈。对执行引擎来说,栈顶才是有效的当前栈,
stackoverflower 当前申请的栈空间大于虚拟机允许的栈空间。outofmemory 虚拟机栈无法申请足够空间);本地方法栈和虚拟机栈基本一样,不过本地方法栈主要存储 native
的方法信息。程序计数器主要是记录当前线程所执行的字节码的行号指示器(私有的,每个线程都是有一个程序计数器)。
2.Java 的引用
1.Java 中的引用有四种,分别是强引用,软引用,弱引用以及虚引用。
a.首先是强引用。即常用的创建对象object o = new object();只要强引用还存在,垃圾
回收器就永远不会回收掉此类对象。
b.软引用。用来描述一些还有用但非必需的对象。在内存即将发生内存溢出之前,会把这些对象列进回收范围二次垃圾回收。
c.弱引用。描述非必需的对象。被弱引用关联的对象只能存活到下一次垃圾收集发生之前。
d.虚引用。最弱的一种引用关系。无法通过一个虚引用获得一个对象实例;一个对象是否有虚引用,都不会对其生存周期构成影响。
虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合
使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中.程序可以通过判断引用队列中是否已经加入了虚引用。
软引用、弱引用的使用场景原理分析:实现内存敏感的高速缓存。
3.什么叫 jvm
JVM 也称 Java 虚拟机,全称为 Java Virtual Mechine。简单来说就是 Java 编译器和 OS(操作系统)的中间介质。
4.类加载的过程
a.加载:加载是类加载的第一个阶段,就是将类的内容加载到 JVM 中
通过一个类的全限定名(绝对路径)来获取定义此类的二进制字节流。
b.验证:
目的是为了确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚
拟机自身的安全。
c.准备:
简单来说就是变量的初始化,这些变量所使用的内存都将在方法区中进行分配。a. 这时候进行内存分配的仅包括类变量(被 static 修饰的变量),而不包括实例变量,实例 变量将会在对象实例化时随着对象一起分配在Java堆中。b.这里所说的初始值“通常情况” 下是数据类型的零值。
d.解析:
解析是虚拟机将常量池内的符号引用替换为直接引用的过程.
e.初始化:
初始化是类加载过程的最后一步,到了此阶段,才真正开始执行类中定义的 Java 程序代码。 在准备阶段,类变量已经被赋过一次系统要求的初始值,初始化阶段是执行类构造器()方法的过程。

java--jvm虚拟机--重点面试题_第2张图片
5.双亲委派机制
java--jvm虚拟机--重点面试题_第3张图片
启动类加载器是 c++实现,独立 jvm 是加载 javahome 下的 lib 类库。应用程序不能直接使用。
扩展类加载器是java home下的类或者类系统变量。开发者可以直接是使用。
应用程序类加载器主要是加载用户指定的路径。如果应用程序么有指定自定义的类加载器,
默认是这个加载器。
过程:当用户需要加载器时候,首先不会使用自己类加载器这个类。而是首先调用父类加载器将请求委派给父类加载器去完成。每一层都是这样的,因此所有的加载最终都会到达顶层的启动
类的加载器。当父类加载器反馈不能加载,才会将加载的任务给子类。
好处:1.java 加载有了优先级。2.保证了 java 程序运行的稳定性。实现简单

你可能感兴趣的:(jvm)