你可能不知道的jvm的类加载机制
引言:在java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成的。
加载:查找并加载类的二进制数据(class文件加载到内存中)
连接:a 验证:确保被加载类的正确性。
b准备:为类的静态变量分配内存,并将其初始化为默认值。
c解析:把类中的符号引用转换为直接引用。
初始化:为类的静态变量赋予正确的初始值。
-----java程序对类的使用方式分为两种(主动使用,被动使用)
-----创建类的实例
-----访问某个类或者接口的静态变量 getstatic指令,或者对该静态变量赋值。 putstatic 指令
-----调用类的静态方法 invoke指令
-----反射
-----初始化一个类的子类
-----包含main方法的类
类的加载
类的加载指将类的.class文件的二进制数据读入到内存中,将其放在运行时数据的方法去内,然后在内存中创建一个java.lang.Class对象用来封装类在方法去内的数据结构。(hotspot虚拟机把其放入在方法区)
*加载.class文件的方式(jvm未指定class的加载路径)
---从本地系统中直接加载
---通过网络下载.class文件
---从zip jar等文件中加载class文件
---将java源文件动态编译为.class文件(运行期动态编译加载的类)
-xx:+TraceClassLoading 用于追踪类的加载信息并打印出来(-xx:+<option>表示开启option选项 -xx:-<option>表示关闭option选项 -xx:<option>=<value> 表示给选项赋值)
final : 在编译阶段,被final static 修饰的常量会放入到调用常量所在类的常量池中。不会触发定义类的常量的初始化。
javap -c .class文件 查看反编译信息 助记符ldc 表示将int float string 类型的常量值从常量池中推送至栈顶。 助记符bipush表示单字节(-128-127)的常量推送至栈顶。 若数字范围越界 则 助记符变为 sipush(短整形常量值)
iconst_(12345)提供了5个助记符
anewarray 创建一个引用类型的数组,并将其引用值压至栈顶 newarray 创建一个原始类型(int float char等)数组 ,并将其引用压至栈顶;
类加载器
*java虚拟机自带的加载器
根类加载器(Bootstrap)
扩展类加载器(Extension)
系统(应用)类加载器(system,application)
*用户自定义类加载器
继承java.lang.classLoader
当java虚拟机初始化一个类的时候,要求他的所有父类都已经被初始化;
在初始化一个类时,并不会初始化它所实现的接口;
在初始化一个接口时,并不会先初始化它的父接口;
因此一个父接口并不会应为他的子接口或者实现类的初始化儿初始化,只有当程序首次使用特定接口的静态变量时,才会导致该接口的初始化。
你可能不知道的jvm的类加载机制的更多相关文章
- JVM内存结构 JVM的类加载机制
JVM内存结构: 1.java虚拟机栈:存放的是对象的引用(指针)和局部变量 2.程序计数器:每个线程都有一个程序计数器,跟踪代码运行到哪个位置了 3.堆:对象.数组 4.方法区:字节流(字节码文件) ...
- JVM之类加载机制
JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这 ...
- JVM的类加载机制全面解析
什么是类加载机制 JVM把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制. 如果你对Class文件的结 ...
- 大白话谈JVM的类加载机制
前言 我们很多小伙伴平时都是做JAVA开发的,那么作为一名合格的工程师,你是否有仔细的思考过JVM的运行原理呢. 如果懂得了JVM的运行原理和内存模型,像是一些JVM调优.垃圾回收机制等等的问题我们才 ...
- 一文教你读懂JVM的类加载机制
Java运行程序又被称为WORA(Write Once Run Anywhere,在任何地方运行只需写入一次),意味着我们程序员小哥哥可以在任何一个系统上开发Java程序,但是却可以在所有系统上畅通运 ...
- JVM的类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类加载的过程: 包括加载.链接(含验证.准备 ...
- 【JVM】类加载机制
原文:[深入Java虚拟机]之四:类加载机制 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 类加 ...
- 深入理解JVM(3)——类加载机制
1.类加载时机 类的整个生命周期包括了:加载( Loading ).验证( Verification ).准备( Preparation ).解析( Resolution ).初始化( Initial ...
- (转) JVM——Java类加载机制总结
背景:对java类的加载机制,一直都是模糊的理解,这篇文章看下来清晰易懂. 转载:http://blog.csdn.net/seu_calvin/article/details/52301541 1. ...
随机推荐
- 人脸姿态校正算法 附完整C++示例代码
在一些特殊情况下,经常需要依据图像中的人脸,对图片进行倾斜矫正. 例如拍照角度幅度过大之类的情况,而进行人工矫正确实很叫人头大. 那是不是可以有一种算法,可以根据人脸的信息对图片进行角度的修复呢? 答 ...
- Maven的使用
在项目中,我们通常会为项目添加多种多样的依赖包(jar包),去网上下载,然后引入到项目中,很是麻烦. 但是用maven后,这一切都将变得简单起来.由于我的MyEclipse已经集成了maven插件,这 ...
- 基于Python的数据分析:数据库索引效率探究
索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更长.有得有失.我希望做一些研究测试,搞清楚索引对于我们使用数 ...
- threesum
算法题 问题描述:在一些给定的数中,找到三个数,他们相加的和是0,并且这三个数的组合是不能重复的 例子: input [-1, 0, -1, 2, 1] Output [[-1, 1 ,0], [-1 ...
- jenkins构建基于gradle的springboot项目CI采坑(采用jar方式部署)
试了一堆插件,最后用的还是 publish over SSH jenkins基本配置不多说了,就是配置一下git仓储,配置一下gradle执行命令 clean bootRepackage 之后执行Se ...
- lintcode 在O(1)时间复杂度删除链表节点
题目要求 给定一个单链表中的一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点. 样例 Linked list is 1->2->3->4, and giv ...
- 团队项目第二阶段个人进展——Day6
一.昨天工作总结 冲刺第六天,学习了leancloud的一些数据处理知识,并看了如何在微信小程序中使用 二.遇到的问题 无 三.今日工作规划 通过动手完成一个demo来学习后端数据的请求和响应
- 从 源码 谈谈 redux compose
compose,英文意思 组成,构成. 它的作用也是通过一系列的骚操作,实现任意的.多种的.不同的功能模块的组合,用来加强组件. 看看源码 https://github.com/reactjs/red ...
- Swagger使用教程大全,从入门到精通
Swagger是遵守OpenAPI规范(OAS)的世界上最大的API框架开发工具,可在整个API生命周期内进行开发,从设计和文档到测试和部署.它提供了许多试用的工具来帮助开发者进行接口开发,如及时接口 ...
- Tiny4412MMU内存管理
MMU是Memory Management Unit的缩写,中文名是内存管理单元,MMU是由ARM芯片中的cp15协处理器管理,它的作用是负责虚拟内存到物理内存的映射 要将虚拟内存映射为物理内存,就要 ...