此处主要需要知道什么是java虚拟机?java虚拟机如何进行类加载的?

java语言本身是编译型和解释型的语言,先对本地的java文件进行编译,编译后会在本地生成一个class文件,而这个生成的class文件就是java虚拟机需要加载的类

所谓的java虚拟机就是JVM(java virtual machine),对应不同的操作系统有不同的版本,如有window版本,Linux版本等,正是因为JVM,java语言才实现了跨平台。

而编译和解释分开,可以实现一次编译,处处运行,只需要加载class类到内存中,即可实现运行,而无需从新编译。若文件修改了,会重新进行编译。

虚拟机的类加载机制:把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型

在java语言里,类的加载,连接和初始化都是在运行期间完成的,这种策略会降低性能,但提供了灵活性,java的动态扩展功能就是依赖于运行期间的动态加载和动态连接来实现的。

使用java运行期间类加载的实例:

1.编写的接口应用程序,可以等到运行时在指定其实现类;

2.用户自定义的类加载器,可以让本地程序在运行时从网络上下载一段二进制流数据作为程序代码的一部分。

类的生命周期:

加载,验证,准备,初始化和卸载的顺序是确定的,类的加载必须按照这个顺序开始(不是运行,可以交叉进行),而解析阶段则不一定,它在某些情况下可以在初始化之后再开始,为支持java的动态绑定。

类加载的过程:

加载,验证,准备,解析,初始化几个阶段的具体操作

加载:是类加载过程中的一个阶段,

1)通过类的全限定名获取此文件的二进制字节流,

2)将字节流所代表的静态存储结构转换为方法区的运行时数据结构

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

对于Hotspot虚拟机而言,Class对象比较特殊,它虽然是对象,但是存放在方法区里面。

验证:验证是连接阶段的第一步,为了保证Class文件中的字节流中包含的信息是符合虚拟机的要求的,不对虚拟机有危害。这个阶段很重要,决定了虚拟机是否能承受恶意的攻击。

大致完成4个校验:文件格式验证(字节流是否符合规范),元数据验证(对字节码语义解析,其信息符合java规范要求),字节码验证(语义合法,符合逻辑),符号引用验证(符号引用转为直接引用)。

准备:正式为类变量分配内存并设置类变量初始化值,都在方法区中进行分配。分配的是static修饰的变量,初始化值一般为默认值,

解析:是虚拟机将常量池内的符号引用替换为直接引用的过程,

1)符号引用:以一组符号来描述所引用的目标,只要符号在使用时可以直接定位到目标即可。

    如:String  st1="java"; String st2=" programm" ; String st3=st1+st2;  这是属于符合引用,在解析时,会把String st3=st1+st2 替换为st3="java programm",

    2)  直接引用:直接引用可以直接指向目标的指针,相对偏移量或者一个能间接定位到目标的句柄。如果有了直接引用,则引用的目标已经在内存中存在。

初始化:类初始化阶段是类加载的最后一步,在此阶段,才开始真正的执行java程序代码(字节码)。

  初始化阶段是执行类构造器<clinit>()方法的过程。clinit()方法对类或者接口来说并不是必须的,如果一个类中没有静态语句块,也没有对变量的赋值操作,则编译器也可以不为这个类生成clinit方法。

  一般java程序中运行程序需要程序规定的public static void main(String []args){}这个方法作为入口,符合初始化的要求,main是静态方法,这样类在初始化时会执行此方法。

java虚拟机之虚拟机类加载机制的更多相关文章

  1. 《深入理解 Java 虚拟机》学习 -- 类加载机制

    <深入理解 Java 虚拟机>学习 -- 类加载机制 1. 概述 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 J ...

  2. JVM虚拟机—JVM的类加载机制

    1 什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...

  3. Java魔法堂:类加载机制入了个门

    一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM ...

  4. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  5. 虚拟机系列 | JVM类加载机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.类加载简介 类的加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封 ...

  6. JVM虚拟机(一):类加载机制

    类加载的时机   类加载的生命周期为: 加载.验证.准备.解析.初始化.使用.卸载七个阶段,其中验证.准备.解析三个阶段统称为连接.其中加载与连接时交叉执行的. 类必须初始化的六种情况 遇到new.g ...

  7. Java虚拟机之类加载机制

    ⑴背景   Java虚拟机把Class文件加载到内存中,并对数据进行校验,转换解析,和初始化,最终形成被虚拟机直接使用的Java类型,这就是类加载机制. ⑵Jvm加载Class文件机制原理 类的生命周 ...

  8. Java和Tomcat类加载机制

    转自:http://blog.csdn.net/codolio/article/details/5027423 加载类是运行程序的基础,了解Java和Tomcat的类加载机制对更有效地开发.调试Web ...

  9. 剑指Offer——知识点储备-故障检测、性能调优与Java类加载机制

    剑指Offer--知识点储备-故障检测.性能调优与Java类加载机制 故障检测.性能调优 用什么工具可以查出内存泄露 (1)MerroyAnalyzer:一个功能丰富的java堆转储文件分析工具,可以 ...

  10. Java类加载机制总结

    关于Java类加载机制的几个基本概念: JDK提供的基本类加载器:引导类加载器(Bootstrap Class Loader)-用于加载JDK中的核心类.扩展类加载器(Ext Class Loader ...

随机推荐

  1. spring cloud 定时任务

    项目中,因为使用了第三方支付(支付宝和微信支付),支付完毕后,第三方支付平台一般会采用异步回调通知的方式,通知商户支付结果,然后商户根据通知内容,变更商户项目支付订单的状态.一般来说,为了防止商户项目 ...

  2. Spark共享变量(广播变量、累加器)

    转载自:https://blog.csdn.net/Android_xue/article/details/79780463 Spark两种共享变量:广播变量(broadcast variable)与 ...

  3. 53.CSS---CSS水平垂直居中常见方法总结

    CSS水平垂直居中常见方法总结 1.元素水平居中 当然最好使的是: margin: 0 auto; 居中不好使的原因: 1.元素没有设置宽度,没有宽度怎么居中嘛! 2.设置了宽度依然不好使,你设置的是 ...

  4. Django框架获取各种form表单数据

    Django中获取text,password 名字:<input type="text" name="name"><br><br& ...

  5. c#链接access数据库

    public ActionResult Index() { OleDbDataAdapter db = new OleDbDataAdapter("select * from [user]& ...

  6. js 计算后样式封装

    function getStyle(obj,attr){ // 需要获取的元素 属性 if(obj.currentStyle){ return obj.currentStyle[attr]; }els ...

  7. 大话npm,cnpm和yarn

    npm:基于node.js的包管理工具; 常用命令 npm install 包名; 缺点:因服务器在国外,所以下载包的速度超级慢,所以出现了cnpm和yarn cnpm:跟npm是一样的,这是淘宝出的 ...

  8. Spring Data Solr入门

    如何将Solr的应用集成到Spring中? SpringDataSolr就是为了方便Solr的开发所研制的一个框架,其底层是对SolrJ的封装. SpringDataSolr入门小Demo 首先目录结 ...

  9. 写Java代码分别使堆溢出,栈溢出

    首先要搞清楚堆栈里放的什么东西: 栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间,堆分配每一个对象内容(实例)内存空间. 一个变量可以先后指向多个对象实例:数组.链表等 ...

  10. JS设计模式(3)代理模式

    什么是代理模式? 情景:小明追女生 A 非代理模式:小明 =花=> 女生A 代理模式:小明 =花=> 让女生A的好友B帮忙 =花=> 女生A 定义:为其他对象提供一种代理以控制对这个 ...