JVM作业

01-简述JDK,JRE,JVM之间的关系(最好结合官网的原话)

直观上看: JDK包含了JRE,JRE包含了JVM。
官网解释说JDK是JRE的超集,它包含了JRE所有的内容,而JRE包含了一些类库,Java环境运行所需要的JVM,换句话说就是包含了代码运行的一个环境的支撑。

三者具体说明

JDK: 它在开发者层面提供了一些Tools Api使开发者能够去进行相应的开发。
JRE: 提供一些开发所需要的类库、jvm,提供了一个代码运行环境的支撑。
JVM: 一次编写,到处乱跑,它支持在不同平台上运行(跨平台性)。

02-描述一下类加载机制的含义和过程

含义: 将class文件加载加载到正在运行的JVM中(保证只被加载一次)
过程分三步:
1)装载: 通过ClassLoader进行装载类(为了避免相同路径出现两个相同的类这 里需要一个机制:双亲委派机制,保证只有一个被加载,不然就会有问题啦),装载完成需要把它放入JVM中,放的时候将class打散放入,首先将静态文件放入方法区,然后将对象放入JVM堆中。
2)链接: 首先对class文件的验证(验证class类的一个正确性),其次对静态变量进行内存分配并且将它初始化为默认值(比如int类型是0),最后解析,就是将符号引用变成直接引用(翻译:将class中机器语言的符号转换成对应的内存地址)
3)初始化: 为静态变量赋值为真正的值,比如上面int本身是=10,但是初始化的默认值是0,这里则是进行真正的初始化为10

03-说说你对Heap(堆)、Method Area(方法区)、Run-Time Constant Pool(运行时常量池)、PC Register、Java虚拟机栈和本地方法栈的理解(最好结合官网)

首先他们都是存在于JVM的运行时数据区内
堆: JVM中分配比较大的一块区域。所有new出来的对象都会放在堆内存中。并且是所有线程所共享的一个内存区域。
方法区: JVM中有一个方法区,他是所有线程所共享的内存区域,它里面存储这类的文件信息,以及静态变量。比如类中的对象头信息,头信息中记录了他的hash码和分代年龄等信息。
运行时常量池: 首先它是方法区的一部分,这里分两部分说明,第一常量池(编译期间的字面量【文本字符串,final类型的常量值,基本数据类型值】和符合引用)
第二就是运行时常量池(Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。)
PC Register: 程序的计数器,每个线程都会有自己的PC 寄存器。
Java虚拟机栈: 当线程被创建的时候而创建,每一个Java虚拟机线程都有自己私有的一个Java虚拟机栈,而虚拟机栈中存储的是Frames,而Frames表示方法的执行。
本地方法栈: Java在调用native方法(C语言)的时候用到(和C语言相关的)

你可能感兴趣的:(JVM作业)