类加载
类加载过程:
类的加载过程
1、加载:将文件加载为二进制字节码(也就是class文件),这个加载器可以使用系统提供的,也可以使用自定义加载器。
2、链接:分为三个过程:分别为验证、准备、解析。验证
通俗理解为,确保class文件符合当前虚拟机的要求,避免出现破坏虚拟机的自身安全。准备
通俗理解为,为静态变量分配内存,并将其赋初始化值。解析
通俗理解,将我们的类方法名这些符号引用等转变为直接引用,也就是获得地址信息。
3、初始化:对静态类的赋初始值,当然这种主动性的赋值才会初始化变量。
JVM区域有哪些?
共享区域
- 共享区域意味着,资源是处于共享的一种状态,而这样的区域,在JVM中分别为方法区和堆。
1、 方法区:
- 方法区:方法区,我们在JDK1.6之前,称之为永久区,只是现在已经废弃了这种说法,而我们的方法区,主要存储的数据包括:静态变量、常量、类信息和常量池等数据
- 他也被称为
非堆
。
2、堆
- 堆同样也是共享区域,它是我们JVM储存中最大的一块区域,主要储存着实例化的对象,因为实例化的对象存在极快的存活与死亡转换,所以我们的垃圾回收的机制,很多都发生在堆这个区域。
- 而堆这个区域也就有了我们的分代区:eden、survivor from、survivor to和老年代等空间。
- 同样就会延伸到垃圾回收的算法:标记清除,标记压缩和复制算法等三种,分别针对不同的场景和区域进行不同的使用。
非共享区域
3、 程序计数器
- 程序计数器:记录机器码的地址位置,相当于是执行引擎同来记录字节码运行的位置。当然如果方法为本地方法,则这个记录值就为空。
- 这是唯一一个不存在内存溢出的小空间。
4、虚拟机栈
- 也就是我们常说到的栈,这样的结构,主要是确保程序运行时,具有先进出的顺序,这样的顺序不正好符合,主线程main第一个被运行,作为栈帧被放入虚拟机栈中,同时会分出以下几个区域:
局部变量区
:我们方法作为一个栈帧被加载,同时其中的局部变量也会被加载至这个区域,以供我们的操作使用。
操作数栈
:通过加载了运算符,来计算我们的公式后的结果。
动态链接
:同样保存我们的类名称所指向的地址值,而非引用。
方法返回地址
:该方法运行完毕,也就是我们的栈帧结束运行后,回到方法在上一个线程的位置。继续向下运行。
5、本地方法栈
- 本地方法栈,作为一个似栈非栈的区域,倒不如我们直接这样理解:
- 他就是用来存放java语言调用非java语言实现的接口
- 它和虚拟机栈的作用十分相似,只是我们的本地方法栈,会有一个本地方法接口作为接入我们本地方法库的中间件。
结语
- 本次是对简单的类加载解读和区域的简单解读,如果有不清楚或错误的地方,还望批评指正。