Java进阶-jvm(二)

本文详细介绍了Java虚拟机(JVM)的类加载子系统,包括类加载的过程、类加载器的分类以及双亲委派机制。接着讲解了JVM运行时数据区,包括程序计数器、虚拟机栈、本地方法栈、Java堆内存和方法区的详细信息。文章还探讨了JVM的本地方法接口和执行引擎,包括解释器和JIT编译器的作用,解释了为什么Java是半编译半解释型语言。
摘要由CSDN通过智能技术生成

JVM结构-类加载

类加载子系统

 

类加载器子系统负责从文件系统或者网络中加载class文件.classLoader只负责class文件的加载,由Execution Engine决定是否可以运行.加载的类信息存放于一块方法区称为(元空间)的内存空间.

类加载的角色

 

1.Class File存在于硬盘上,而最终这个模板再执行的时候要加载JVM当中来,根据这个模板实例化出n个一模一样的实例.

2.class file 加载到JVM中,被称为DNA元数据模板,放在方法区.

3.在.class-->JVM-->最终称为元数据模板,此过程就要有一个运输工具(类加载器Class Loader)扮演一个快递员的角色.

类加载的过程

 

加载

1.通过类名(地址)获取此类的二进制字节流.

2.将这个字节流锁代表的静态存储结构转换为方法区(元空间)的运行时结构.

3.在内存中生成一个代表这个类的java.lang.Class对象,作为这个类的各种数据的访问入口.

链接

验证:检验别加载的类是否有正确的内部结构,并和其他类协调一致;

验证文件格式是否一致:class文件在文件开头有特定的文件标识(字节码文件都以CA FE BA BE 标识开头);主,次版本号是否在当前Java虚拟机接受范围内.

原数据验证:对字节码描述的信心进行语义分析,以保证其描述的信息符合java语言规范的要求,例如这个类是否有父亲;是否继承浏览不允许被继承的类(final修饰的类)...

准备:准备阶段则负责为类的静态属性分配内存,并设置默认值;不包含final修饰的static常量,在编译时进行初始化.

类什么时候初始化

1.创建类的实例,new 一个对象.

2.访问某个类或接口的静态变量,或者对该静态变量赋值.

3.调用类的静态方法.

4.反射(Class.forName("")).

5.初始化一个类的子类(会首先初始化子类的父类).

类的初始化顺序

父类static->子类static->父类构造方法->子类构造方法.

对static修饰的变量或语句块进行赋值,如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序一次执行.

类加载器的分类

站在JVM角度看,类加载器可以分为两种:

1.引导类加载器(启动类加载器Bootstrap ClassLoader).不是用java语言写的.

2.其他所有类加载器.指java语言写的其他类加载器.

而站在java开发人员角度来看,类加载器分为:

1.引导类加载器:

这个类加载器使用c/c++语言实现,嵌套在JVM

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值