JVM学习之初识虚拟机

一、概述

1.什么是Java虚拟机?

虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统,是物理机的软件实现。

2.Java虚拟机的生命周期及体系结构

虚拟机的启动:Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

虚拟机的退出:

  • 某线程调用RunTime类或System类的exit方法,或RunTime类的halt方法,并且Java安全管理器也允许这次exit或halt操作
  • 程序正常执行结束
  • 程序在执行过程中遇到看异常或错误而异常终止
  • 由于操作系统出现错误而导致Java虚拟机进程终止

二、类的加载:

一、过程:

1.加载:

  • 通过一个类的全限定名获取定义此类的二进制字节流
  • 将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构
  • 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口

2.链接:

验证(Verify):

  • 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全
  • 主要包括四种验证:文件格式验证,元数据验证,字节码验证,符号引用验证

准备(Prepare):

  • 为类变量分配内存并且设置该类变量的默认初始值,即零值
  • 这里不包含用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显示初始化;
  • 这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
  • 见LoadClass.java

解析(Resolve):

  • 将常量池内的符号引用转换为直接引用的过程
  • 事实上,解析操作往往会伴随着JVM在执行完初始化之后在执行 符号引用就是一组符号来描述所引用的的目 标。符号引用的字面量形式明确定义在《java虚拟机规范》的Class文件格式中

在解析阶段,jvm根据字符串的内容找到内存区域中相应的地址,然后把符号引用替换成直接指向目标的指针、句柄、偏移量等,这些直接指向目标的指针、句柄、偏移量就被称为直接引用。

  • 解析动作主要是针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。
  • 见Demo.java

3.初始化:

  • 初始化阶段就是执行类构造器方法<clinit>()的过程。
  • 此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。
  • <clinit>()不同于类的构造器。(关联:构造器是虚拟机视角下的<init>())
  • 若该类具有父类,JVM会保证子类得<clinit>()执行前,父类的<clinit>()已经执行完毕。
  • 虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁。
  • 见Clinit.java

二、类的加载器

1.加载器的分类

 Jvm支持两种类型的类加载器,分别是引导类加载器(Bootstrap ClassLoader)和自定义类记载器(User-Defined ClassLoader)

为什么要自定义类加载器?

  • 隔离加载类
  • 修改类加载类的方式,根据实际情况在某个时间点按需动态加载
  • 扩展加载源:网络、数据库、机顶盒
  • 防止源码泄露

三、双亲委派机制

优势:

  • 避免类的重复加载
  • 保护程序安全,防止核心API被随意篡改

 

 

【学习随笔】:学习尚硅谷宋红康老师课程随笔

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值