你可能不知道的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. ...
随机推荐
- Java 8 基础教程 - Predicate
在Java 8中,Predicate是一个函数式接口,可以被应用于lambda表达式和方法引用.其抽象方法非常简单: /** * Evaluates this predicate on the giv ...
- [ SSH框架 ] Struts2框架学习之一
一.Struts2框架的概述 Struts2是一种基于MVC模式的轻量级Web框架,它自问世以来,就受到了广大Web开发者的关注,并广泛应用于各种企业系统的开发中.目前掌握 Struts2框架几乎成为 ...
- 论文笔记(1):Deep Learning.
论文笔记1:Deep Learning 2015年,深度学习三位大牛(Yann LeCun,Yoshua Bengio & Geoffrey Hinton),合作在Nature ...
- 记一次webpack打包优化
未进行打包优化的痛点: 随着项目的不断扩大,引入的第三方库会越来越多,我们每次build的时候会对所有的文件进行打包,耗时必定很长,不利于日常开发. 解决思路: 第三方库我们只是引入到项目里来,一般不 ...
- Netty 笔记
1.Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端. 2.早期Java API 使用的阻塞函数 // 创建一个新的ServerSocket, ...
- Spring Boot使用RestTemplate消费REST服务的几个问题记录
我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调用内外部REST接口完成业务逻辑. 在Spring Boot中,调用REST Ap ...
- 跨域cors方法(jsonp,document.domain,document.name)及iframe性质
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- 【转】MySQL int转换成varchar引发的慢查询
转自http://www.cnblogs.com/billyxp/archive/2013/05/31/3110016.html 最近一周接连处理了2个由于int向varchar转换无法使用索引,从而 ...
- python环境搭建-requests的简单安装(适合新手)
安装完python之后,一定要记住安装后的路径.这是我当前的路径. 下面是requests的安装步骤: 我们这里直接用pip安装(这样比较适合新手),新版python自带pip,python3.6.1 ...
- 搭建微信小程序服务
准备域名和证书 任务时间:20min ~ 40min 小程序后台服务需要通过 HTTPS 访问,在实验开始之前,我们要准备域名和 SSL 证书. 域名注册 如果您还没有域名,可以在腾讯云上选购,过程可 ...