JVM知识体系总结1——JVM结构,类加载

1.jvm基本结构

JDK经典体系图:

由图可见,可以分成三部分:

第一部分:Java命令,如javac,jar等

第二部分:Jre支持java运行环境核心内库

第三部分:Java虚拟机,虚拟机的类型是指规范在不同的运行场景实现,常用的HotSpot

我们编写java文件,经过javac命令编辑成class文件在jvm里面运行,jvm从软件层面来解决了不同操作系统在底层硬件与指令上的区别,所以java也是个跨平台的语言

虚拟机结构图:

1,类加载子系统负责动态加载类,在运行时(而非编译时),当一个类初次被引用的时候,它将被加载、链接、初始化

加载:通过类的权限名获取该类的二进制流,将二进制流中的静态存储结构转化为运行时数据结构,在内存中生成该类的class对象,作为数据访问入口。

类的加载方式分为隐式加载和显示加载。隐式加载就是使用new等方式加载,会隐式的调用类加载器把他加载到jvm里面去,显示的就是直接通过调用class.forName()或者classLoader。class.forName()将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块

把通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到了java虚拟机外部去实现,让程序自己觉得如何去获取所需要的累,这个动作的代码模块就是类加载器

从jvm来看,类加载器分为两种,一种是启动类加载器,他是虚拟机的一部分,另外一种就是其他类加载器,他们由java实现,位于虚拟机外部,都继承了java.lang.classLoader

从开发者角度来说:启动类加载器加载存在JAVA_HOMElib目录中或者指定路径中能被虚拟机识别的类,扩展类加载器负责加载JAVA_HOMElibext或者被java.ext.dirs系统变量指定路径找那个的类。应用程序类加载器也称为系统加载器,他负责加载用户路径上指定的类

**双亲委派模式:类只需要加载进内存一次就够了,当父类加载器已经加载了该类子类加载器就不需要在加载了,避免重复,加载器之间的这种层次关系就叫做双亲委派模式。**所有的类加载器除了最顶层的启动类加载器都有自己的父类加载器,这里的父类不是指的继承关系而是组合关系,如果一个类加载器收到了加载请求,它不会立即加载这个类,而是吧这个请求交给父类加载器去完成,依次类推知道顶层,如果父类加载器不能加载则再让子类加载(简单的说就说先让父类去干,父类干不了的在自己干)。

验证:确定class文件的字节流中的信息不危害到虚拟机:格式,元数据,字节码,符号

准备:为静态变量赋默认值

解析:完成符号引用到直接引用的转换,不一定在初始化之前也可能在之后

初始化:给类的静态变量赋予正确的初始值执行静态代码块,真正开始执行类中定义的java程序代码

使用

卸载

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值