JVM详解

一、JVM概述

1.1为什么要学习JVM
中高程序员必备技能:
项目管理、性能调优

1.2虚拟机
虚拟机(Virtual Machine),虚拟计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
VMware属于系统虚拟机,完全对物理计算机的仿真,提供一个可运行完整操作系统的平台。程序虚拟机的典型代表是java虚拟机,专门为执行某个计算机程序而设计。
在java虚拟机中执行的指令称为java字节码指令。
Java虚拟机是一种执行java字节码文件的虚拟机,它拥有独立的运行机制。
Java技术的核心就是Java虚拟机,因为所有的java程序都要在java虚拟机内部运行。

1.3JVM作用
Java虚拟机负责装载字节码到其内部,解释/编译为对应平台上的机器码指令执行,每一条java指令,java虚拟机中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪。
特点:
一次编译到处运行;
自动内存管理;
自动垃圾回收功能;

1.4JVM整体组成部分
类加载器(ClassLoader)
运行时数据区(Runtime Data Area)
执行引擎(Execution Engine)
本地库接口(Native Interface)

二、JVM结构–类加载器

2.1类加载子系统
类加载子系统负责从文件系统或者网络中加载class文件。classLoader只负责class文件的加载,至于它是否可以裕兴,则由Execution Engine决定。
加载的类信息存放于一块称为方法区的内存空间。
class file 存在于硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板在执行的时候是要加载 JVM 当中来,根据这个模板实例化出 n 个实例.
class file 加载到 JVM 中,被称为 DNA 元数据模板. 此过程就要有一个运输工具(类加载器 Class Loader),扮演一个快递员的角色
2.2类加载过程
2.2.1加载
通过类名(地址)获取此类的二进制字节流。
将这个字节流所代表的静态存储结构转换为方法区(元空间)的运行时结构。
在内存中生成一个代表这个类的java.lang.class对象,作为这个类的各种数据的访问入口。
2.2.2链接
验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致;
验证文件格式是否一致: class 文件在文件开头有特定的文件标识(字节码文件都以 CA FE BA BE 标识开头);主,次版本号是否在当前 java 虚拟机接收范围内.
元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合java 语言规范的要求,例如这个类是否有父类;是否继承浏览不允许被继承的类(final 修饰的类)…
准备:准备阶段则负责为类的静态属性分配内存,并设置默认初始值;
不包含用 final 修饰的 static 常量,在编译时进行初始化.
例如: public static int value = 123;value 在准备阶段后的初始值是 0,而不是 123.
解析:将类的二进制数据中的符号引用替换成直接引用(符号引用是 Class 文件的逻辑符号,直接引用指向的方法区中某一个地址)
2.2.3初始化
初始化,为类的静态变量赋予正确的初始值,JVM 负责对类进行初始化,主要对类变量进行初始化。初始化阶段就是执行底层类构造器方法()的过程。此方法不需要定义,是 javac 编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来的。
类什么时候初始化:
JVM规定:每个类或者接口被首次主动使用时才对其进行初始化。
通过 new 关键字创建对象
访问类的静态变量,包括读取和更新
访问类的静态方法
对某个类进行反射操作
初始化子类会导致父类的的初始化
执行该类的 main 函数
除了以上几种主动使用,以下情况被动使用,不会加载类:

引用该类的静态常量,注意是常量,不会导致初始化,但是也有意外,这里的常量是指已经指定字面量的常量,对于那些需要一些计算才能得出结果的常量就会导致类加载,比如:
public final static int NUMBER = 5 ; //不会导致类初始化,被动使用
public final static int RANDOM = new Random().nextInt() ; //会导致类加载
构造某个类的数组时不会导致该类的初始化,比如:
Student[] students = new Student[10] ;
类的初始化顺序

对static修饰的变量或语句块进行赋值
如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
顺序是:父类 static –> 子类 static

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值