第六章 java底层知识:JVM

1、谈谈你对java的理解

平台无关性

GC

语言特性

面向对象

类库

异常处理

2、java如何实现平台无关性

.java文件

javac编译,生成字节码.class文件

jvm解析,转换成特定平台的执行指令

java源码首先被编译成字节码,再由不同平台的jvm进行解析,java语言在不同的平台上运行时不需要重新进行编译,java虚拟机在执行字节码时,把字节码转换成具体平台上需要的指令

3、jvm如何加载.class文件

java虚拟机

class loader:依据特定格式,加载class文件到内存

Execution Engine:对命令进行解析

native Interface:融合不同开发语言的原生库为java所用

Runtime Data Area:jvm内存结构模型

4、反射

java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

5、谈谈classLoader

编译器将a.class源文件编译为a.class字节码文件

classLoader将字节码转换为jvm中的class<a>对象

jvm利用class<a>对象实例化为a对象

classLoader在java中有着非常重要的作用,它主要工作在class装载的加载阶段,其主要作用是从系统外部获得class的二进制数据流。它是java的核心组件,所有的class都是由classLoader进行加载的,classLoader负责通过将class文件里的二进制数据流装载进系统,然后交给java虚拟机进行连接、初始化等操作。

classLoader的种类:

bootstrapClassLoader:C++编写,加载核心库java.*

ExtClassLoader:java编写,加载扩展库javax.*

appClassLoader:java编写,加载程序所在目录。

自定义classLoader:java编写,定制化加载

6、为什么使用双亲委派机制去加载类

避免多份同样字节码的加载

双亲委派模型工作过程是:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(ClassNotFoundException),子加载器才会尝试自己去加载。

7、类的加载方式

隐式:new

显示加载:loadClass、forName

类的装载过程:

加载:classLoader加载class字节码,生成class文件

链接:校验(检查加载的class文件的正确性和安全性) 准备(为类变量分配存储空间并设置类变量初始值) 解析(jvm将常量池内的符号引用转换成直接引用)

初始化(执行类变量赋值和静态代码块)

class.forname 得到的class是已经初始化完成的

class.loadclass得到的class是还没有链接的

8、java内存模型

线程私有:程序计数器、虚拟机栈、本地方法栈

程序计数器:当前线程所执行字节码的行号指示器,改变计数器的值来选取下一条需要执行的字节码指令

native方法计数器值为undefined  不会发生内存泄漏

虚拟机栈:java方法执行的内存模型  包含多个栈帧,

局部变量表:包含方法执行过程中的所有变量

操作数栈:入栈、出栈、复制、交换、产生消费变量

动态链接出口

本地方法栈:java虚拟机栈是为java方法服务的,本地方法栈为native方法服务

线程共享:

堆:存放所有对象实例

常量池:类信息、常量、静态变量,即编译器编译后代码的数据

猜你喜欢

转载自blog.csdn.net/lupa1521/article/details/89392809