1 JVM定位

01.为什么Java代码可以实现一次编写、到处运行?
    JVM(Java虚拟机)是Java跨平台的关键。
    在程序运行前,Java源代码(.java)需要经过编译器编译成字节码(.class)。在程序运行时,JVM负责将字节码翻译成特定平台下的机器码并运行,也就是说,只要在不同的平台上安装对应的JVM,就可以运行字节码文件。
    同一份Java源代码在不同的平台上运行,它不需要做任何的改变,并且只需要编译一次。而编译好的字节码,是通过JVM这个中间的“桥梁”实现跨平台的,JVM是与平台相关的软件,它能将统一的字节码翻译成该平台的机器码。
    编译的结果是生成字节码、不是机器码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行;
    跨平台的是Java程序、而不是JVM,JVM是用C/C++开发的软件,不同平台下需要安装不同版本的JVM。

02.JVM、JRE及JDK的关系
    JDK是Java的开发工具,JRE是Java程序运行所需的环境,JVM是Java虚拟机.它们之间的关系是JDK包含JRE和JVM,JRE包含JVM

03.JVM主要由四大部分组成:
     ClassLoader(类加载器),
     Runtime Data Area(运行时数据区,内存分区),
     Execution Engine(执行引擎),
     Native Interface(本地库接口)

04.Java对象的四种引用方式分别是强引用、软引用、弱引用、虚引用,具体含义如下:
    强引用:这是Java程序中最常见的引用方式,即程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用变量来操作实际的对象。当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收。
    软引用:当一个对象只有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象。当系统内存空间不足时,系统可能会回收它。软引用通常用于对内存敏感的程序中。
    弱引用:弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然,并不是说当一个对象只有弱引用时,它就会立即被回收,正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收。
    虚引用:虚引用完全类似于没有引用。虚引用对对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用时,那么它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列联合使用。

05.JVM是如何运行的?
    JVM的装入环境和配置
    装载JVM
    初始化JVM,获得本地调用接口
    运行Java程序

06.JVM中的堆一般分为三部分,新生代、老年代和永久代。
    新生代:主要是用来存放新生的对象。一般占据堆空间的1/3,由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。
    老年代:老年代的对象比较稳定,所以MajorGC不会频繁执行。
    永久代:内存的永久保存区域,主要存放Class和Meta(元数据)的信息。

2 类的生命周期

3 JVM内存模型

4 JVM运行时的内存区域

5 类的初始化

6 助记符

7 JVM四种引用级别

8 静态变量的初始化问题

9 双亲委派

10 自定义加载器的实现

11 自定义加载器的流程

12 ClassLoader源码解读

13 双亲委派避免重名问题

14 不同加载器在继承关系下的加载问题

15 OSGi规范

16 类的卸载

17 JVM检测工具

18 GC调优