JVM入门到放弃之虚拟机类加载机制

java类文件结构 --> java虚拟机加载机制 --> java运行时数据区 --> java垃圾回收策略
静态 --> 动态
生 —> 死

一、虚拟机类加载机制

先给大家看几个熟悉的图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 加载class文件到内存

1.1.1 加载

  • 获取二进制字节流
  • 静态存储结构转化为方法区的运行时数据结构
  • 在java堆里面生成一个类对象,作为方法区访问的入口

1.1.2 验证

  • 验证class文件的标识,魔数
  • 验证class文件的版本号
  • 验证常量池(常量类型、常量类型数据结构是否正确、UTF-8是否符合标准)
  • class文件每个部分(字段表、方法表等)是否正确
  • 元数据验证(父类验证、继承验证、接口实现验证)
  • 字节码验证(指令验证)
  • 符号引用验证(通过符号引用是否能找到字段、方法、类)

例如:
这是我们的一个class类文件在这里插入图片描述
当我们执行javap -v TestClass01时就会看到编译后的情况
在这里插入图片描述
我这里随便改了几个地方,然后我们再看看效果
在这里插入图片描述
这边很清楚的看到编译报错了,有个乱码问题我就懒得处理了,看到效果即可。
在这里插入图片描述我想想还是给大家解决一下乱码问题,给你们看个方便吧
在这里插入图片描述
这就是上面编译报的异常:常量池出错

再看看执行时候的,假如我更改了ca fe ba be
在这里插入图片描述
在这里插入图片描述

1.1.3 装备

为类变量分配内存并且设置类变量的初始化阶段。

只对static类变量进行内存分配

static int m = 2 ;
初始化是 0 ,而不是2 ,因为这时候还没执行任何java方法()

static final int m = 2 ;
对应到常量池ConstantValue,在准备阶段 m 就被赋值为2

类变量:一般称为静态变量
实例变量:当对象实例化时,实例变量就跟着确定,随着对象的销毁而销毁

1.1.4 解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1.5 初始化

在这里插入图片描述

二、类加载器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
AppClassLoader有一个父类加载器:ExtClassLoader
在这里插入图片描述
ExtClassLoader有一个父类加载器:BootstrapClass
BootstrapClass == null
在这里插入图片描述
native 是本地方法接口,BootstrapClass负责jdk/jre下面的类库加载到内存(如:rt.jar)
在这里插入图片描述
看一下源码加载了什么
AppClassLoader
在这里插入图片描述
ExtClassLoader
在这里插入图片描述

我们来打印一下
在这里插入图片描述
C:\Program Files\Java\jdk1.8.0_172\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_172\jre\lib\rt.jar;F:\jikang_workSpace_dome01\lambda\target\test-classes;F:\jikang_workSpace_dome01\lambda\target\classes;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter-web\2.0.1.RELEASE\spring-boot-starter-web-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter\2.0.1.RELEASE\spring-boot-starter-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot\2.0.1.RELEASE\spring-boot-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.1.RELEASE\spring-boot-autoconfigure-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.0.1.RELEASE\spring-boot-starter-logging-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\Chris.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\Chris.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;C:\Users\Chris.m2\repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;C:\Users\Chris.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\Chris.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\Chris.m2\repository\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter-json\2.0.1.RELEASE\spring-boot-starter-json-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.5\jackson-databind-2.9.5.jar;C:\Users\Chris.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\Chris.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.5\jackson-core-2.9.5.jar;C:\Users\Chris.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.5\jackson-datatype-jdk8-2.9.5.jar;C:\Users\Chris.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.5\jackson-datatype-jsr310-2.9.5.jar;C:\Users\Chris.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.5\jackson-module-parameter-names-2.9.5.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.0.1.RELEASE\spring-boot-starter-tomcat-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.29\tomcat-embed-core-8.5.29.jar;C:\Users\Chris.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.29\tomcat-embed-el-8.5.29.jar;C:\Users\Chris.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.29\tomcat-embed-websocket-8.5.29.jar;C:\Users\Chris.m2\repository\org\hibernate\validator\hibernate-validator\6.0.9.Final\hibernate-validator-6.0.9.Final.jar;C:\Users\Chris.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\Chris.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\Chris.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\Chris.m2\repository\org\springframework\spring-web\5.0.5.RELEASE\spring-web-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-beans\5.0.5.RELEASE\spring-beans-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-webmvc\5.0.5.RELEASE\spring-webmvc-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-aop\5.0.5.RELEASE\spring-aop-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-expression\5.0.5.RELEASE\spring-expression-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter-test\2.0.1.RELEASE\spring-boot-starter-test-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-test\2.0.1.RELEASE\spring-boot-test-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-test-autoconfigure\2.0.1.RELEASE\spring-boot-test-autoconfigure-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;C:\Users\Chris.m2\repository\net\minidev\json-smart\2.3\json-smart-2.3.jar;C:\Users\Chris.m2\repository\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;C:\Users\Chris.m2\repository\org\ow2\asm\asm\5.0.4\asm-5.0.4.jar;C:\Users\Chris.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\Chris.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Chris.m2\repository\org\assertj\assertj-core\3.9.1\assertj-core-3.9.1.jar;C:\Users\Chris.m2\repository\org\mockito\mockito-core\2.15.0\mockito-core-2.15.0.jar;C:\Users\Chris.m2\repository\net\bytebuddy\byte-buddy\1.7.11\byte-buddy-1.7.11.jar;C:\Users\Chris.m2\repository\net\bytebuddy\byte-buddy-agent\1.7.11\byte-buddy-agent-1.7.11.jar;C:\Users\Chris.m2\repository\org\objenesis\objenesis\2.6\objenesis-2.6.jar;C:\Users\Chris.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\Chris.m2\repository\org\hamcrest\hamcrest-library\1.3\hamcrest-library-1.3.jar;C:\Users\Chris.m2\repository\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;C:\Users\Chris.m2\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;C:\Users\Chris.m2\repository\org\springframework\spring-core\5.0.5.RELEASE\spring-core-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-jcl\5.0.5.RELEASE\spring-jcl-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-test\5.0.5.RELEASE\spring-test-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\xmlunit\xmlunit-core\2.5.1\xmlunit-core-2.5.1.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter-data-redis\2.0.1.RELEASE\spring-boot-starter-data-redis-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\data\spring-data-redis\2.0.6.RELEASE\spring-data-redis-2.0.6.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\data\spring-data-keyvalue\2.0.6.RELEASE\spring-data-keyvalue-2.0.6.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\data\spring-data-commons\2.0.6.RELEASE\spring-data-commons-2.0.6.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-tx\5.0.5.RELEASE\spring-tx-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-oxm\5.0.5.RELEASE\spring-oxm-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\io\lettuce\lettuce-core\5.0.3.RELEASE\lettuce-core-5.0.3.RELEASE.jar;C:\Users\Chris.m2\repository\io\projectreactor\reactor-core\3.1.6.RELEASE\reactor-core-3.1.6.RELEASE.jar;C:\Users\Chris.m2\repository\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;C:\Users\Chris.m2\repository\io\netty\netty-common\4.1.23.Final\netty-common-4.1.23.Final.jar;C:\Users\Chris.m2\repository\io\netty\netty-transport\4.1.23.Final\netty-transport-4.1.23.Final.jar;C:\Users\Chris.m2\repository\io\netty\netty-buffer\4.1.23.Final\netty-buffer-4.1.23.Final.jar;C:\Users\Chris.m2\repository\io\netty\netty-resolver\4.1.23.Final\netty-resolver-4.1.23.Final.jar;C:\Users\Chris.m2\repository\io\netty\netty-handler\4.1.23.Final\netty-handler-4.1.23.Final.jar;C:\Users\Chris.m2\repository\io\netty\netty-codec\4.1.23.Final\netty-codec-4.1.23.Final.jar;C:\Users\Chris.m2\repository\org\springframework\boot\spring-boot-starter-cache\2.0.1.RELEASE\spring-boot-starter-cache-2.0.1.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-context\5.0.5.RELEASE\spring-context-5.0.5.RELEASE.jar;C:\Users\Chris.m2\repository\org\springframework\spring-context-support\5.0.5.RELEASE\spring-context-support-5.0.5.RELEASE.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2017.1\lib\idea_rt.jar
————————————————————————————————————————————
C:\Program Files\Java\jdk1.8.0_172\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext

2.1 为什么要加载BootStrapClassLoader

在这里插入图片描述
再把这张图拿来给大家看看,我们已经可以通过ApplicationClassloder和EXtentsionClassLoder能获取到我们需要的类库了,为什么还要加载BootStrapClassLoader?
在这里插入图片描述
我这边有一个类,java.util.List
这断代码执行会打印什么?
在这里插入图片描述
为什么不能执行?
因为我们jdk下面已经有一个java.util.List类了
在这里插入图片描述

2.2双亲委任机制

在这里插入图片描述

三、运行时数据区

在这里插入图片描述
在这里插入图片描述
4.即时编译器编译后的代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值