写在前面的话:
面试题总结 多看,多记忆
总结要全面,答案分条
-
1.Java 是如何实现跨平台的?
答:
1.我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。
2.Java 虚拟机(JVM)是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件,运行我们编写的 Java 程序。
3.这个过程,我们编写的 Java 程序没有做任何改变,仅仅是通过 JVM 这一 “中间层” ,就能在不同平台上运行,真正实现了 “一次编译,到处运行” 的目的
2.什么是 JVM ?
答:
JVM,即 Java Virtual Machine,Java 虚拟机。它通过模拟一个计算机来达到一个计算机所具有的的计算功能。JVM 能够跨计算机体系结构来执行 Java 字节码,主要是由于 JVM 屏蔽了与各个计算机平台相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由 JVM 提供者来实现。
3.JVM 由哪些部分组成?
答:JVM 的结构基本上由 4 部分组成:
1.类加载器,在 JVM 启动时或者类运行时将需要的 class 加载到 JVM 中
2.执行引擎,执行引擎的任务是负责执行 class 文件中包含的字节码指令,相当于实际机器上的 CPU
3.内存区,将内存划分成若干个区以模拟实际机器上的存储、记录和调度功能模块,如实际机器上的各种功能的寄存器或者 PC 指针的记录器等
4.本地方法调用,调用 C 或 C++ 实现的本地方法的代码返回结果
4.什么是类加载器
答: 1.类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。
2.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。
3. 类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。
4.实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载的。
5.synchronized关键子的底层实现原理
答:
1.进入时,执行 monitorenter,将计数器 +1,释放锁 monitorexit 时,计数器-1;
2.当一个线程判断到计数器为 0 时,则当前锁空闲,可以占用;反之,当前线程进入等待状态。
6.monitor机制,该关键字是一个几种锁的封装。
答: 1.Synchronized 是在加锁,加对象锁。对象锁是一种重量锁(monitor)
2.synchronized 的锁机制会根据线程竞争情况在运行时会有偏向锁(单一线程)、轻量锁(多个线程访问 synchronized 区域)、对象锁(重量锁,多个线程存在竞争的情况)、自旋锁等。
6.介绍一下Volatitle关键字
答: 该关键字可以保证可见性不保证原子性。
功能:主内存和工作内存,直接与主内存产生交互,进行读写操作,保证可见性;
禁止 JVM 进行的指令重排序。
7.sleep( ) 和 wait( n)、wait( ) 的区别?
答: 1.sleep 方法: 是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。睡眠不释放锁(如果有的话);
2.wait 方法: 是 Object 的方法,必须与 synchronized 关键字一起使用,线程进入阻塞状态,当 notify 或者 notifyall 被调用后,会解除阻塞。但是,只有重新占用互斥锁之后才会进入可运行状态。睡眠时,释放互斥锁