Java虚拟机JVM类加载学习笔记

Java虚拟机JVM类加载学习笔记

ID:37490658

大小:264.00 KB

页数:7页

时间:2019-05-24

Java虚拟机JVM类加载学习笔记_第1页
Java虚拟机JVM类加载学习笔记_第2页
Java虚拟机JVM类加载学习笔记_第3页
Java虚拟机JVM类加载学习笔记_第4页
Java虚拟机JVM类加载学习笔记_第5页
资源描述:

《Java虚拟机JVM类加载学习笔记》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、深入Java虚拟机JVM类加载初始化学习笔记刘岩Email:suhuanzheng7784877@163.com1.Classloader的作用,概括来说就是将编译后的class装载、加载到机器内存中,为了以后的程序的执行提供前提条件。2.一段程序引发的思考:风中叶老师在他的视频中给了我们一段程序,号称是世界上所有的Java程序员都会犯的错误。诡异代码如下:packagetest01;classSingleton{publicstaticSingletonsingleton=newSingleton();publicstaticinta;pu

2、blicstaticintb=0;privateSingleton(){super();a++;b++;}publicstaticSingletonGetInstence(){returnsingleton;}}publicclassMyTest{/***@paramargs*/publicstaticvoidmain(String[]args){Singletonmysingleton=Singleton.GetInstence();System.out.println(mysingleton.a);System.out.println(m

3、ysingleton.b);}}7/7一般不假思索的结论就是,a=1,b=1。给出的原因是:a、b都是静态变量,在构造函数调用的时候已经对a和b都加1了。答案就都是1。但是运行完后答案却是a=1,b=0。下面我们将代码稍微变一下publicstaticSingletonsingleton=newSingleton();publicstaticinta;publicstaticintb=0;的代码部分替换成publicstaticinta;publicstaticintb=0;publicstaticSingletonsingleton=new

4、Singleton();效果就是刚才预期的a=1,b=1。为什么呢,这3句无非就是静态变量的声明、初始化,值的变化和声明的顺序还有关系吗?Java不是面向对象的吗?怎么和结构化的语言似地,顺序还有关系。这个就是和Java虚拟机JVM加载类的原理有着直接的关系。1.类在JVM中的工作原理要想使用一个Java类为自己工作,必须经过以下几个过程1):类加载load:从字节码二进制文件——.class文件将类加载到内存,从而达到类的从硬盘上到内存上的一个迁移,所有的程序必须加载到内存才能工作。将内存中的class放到运行时数据区的方法区内,之后在堆区

5、建立一个java.lang.Class对象,用来封装方法区的数据结构。这个时候就体现出了万事万物皆对象了,干什么事情都得有个对象。就是到了最底层究竟是鸡生蛋,还是蛋生鸡呢?类加载的最终产物就是堆中的一个java.lang.Class对象。2):连接:连接又分为以下小步骤验证:出于安全性的考虑,验证内存中的字节码是否符合JVM的规范,类的结构规范、语义检查、字节码操作是否合法、这个是为了防止用户自己建立一个非法的XX.class文件就进行工作了,或者是JVM版本冲突的问题,比如在JDK6下面编译通过的class(其中包含注解特性的类),是不能在

6、JDK1.4的JVM下运行的。准备:将类的静态变量进行分配内存空间、初始化默认值。(对象还没生成呢,所以这个时候没有实例变量什么事情)解析:把类的符号引用转为直接引用(保留)3):类的初始化:将类的静态变量赋予正确的初始值,这个初始值是开发者自己定义时赋予的初始值,而不是默认值。2.类的主动使用与被动使用以下是视为主动使用一个类,其他情况均视为被动使用!1):初学者最为常用的new一个类的实例对象(声明不叫主动使用)2):对类的静态变量进行读取、赋值操作的。3):直接调用类的静态方法。4):反射调用一个类的方法。5):初始化一个类的子类的时候

7、,父类也相当于被程序主动调用了(如果调用子类的静态变量是从父类继承过来并没有复写的,那么也就相当于只用到了父类的东东,和子类无关,所以这个时候子类不需要进行类初始化)。6):直接运行一个main函数入口的类。所有的JVM实现(不同的厂商有不同的实现,有人就说IBM的实现比Sun的要好……)在首次主动调用类和接口的时候才会初始化他们。7/71.类的加载方式1):本地编译好的class中直接加载2):网络加载:java.net.URLClassLoader可以加载url指定的类3):从jar、zip等等压缩文件加载类,自动解析jar文件找到cla

8、ss文件去加载util类4):从java源代码文件动态编译成为class文件2.类加载器JVM自带的默认加载器1):根类加载器:bootstrap,由C++编写,所

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。