,概括来说就是将编译后的class装载、加载到机器内存中,为了以后的程序的执行提供前提条件。:风中叶老师在他的视频中给了我们一段程序,号称是世界上所有的Java程序员都会犯的错误。诡异代码如下:packagetest01;classSingleton{publicstaticSingletonsingleton=newSingleton();publicstaticinta;publicstaticintb=0;privateSingleton(){super();a++;b++;}publicstaticSingletonGetInstence(){returnsingleton;}}lassMyTest{/******@paramargs*/publicstaticvoidmain(String[]args){Singletonmysingleton=();();();}}一般不假思索的结论就是,a=1,b=1。给出的原因是:a、b都是静态变量,在构造函数调用的时候已经对a和b都加1了。答案就都是1。但是运行完后答案却是a=1,b=0。下面我们将代码稍微变一下publicstaticSingletonsingleton=newSingleton();publicstaticinta;publicstaticintb=0;的代码部分替换成publicstaticinta;publicstaticintb=0;publicstaticSingletonsingleton=newSingleton();效果就是刚才预期的a=1,b=1。为什么呢,这3句无非就是静态变量的声明、初始化,值的变化和声明的顺序还有关系吗?Java不是面向对象的吗?怎么和结构化的语言似地,顺序还有关系。这个就是和Java虚拟机JVM加载类的原理有着直接的关系。,必须经过以下几个过程1):类加载load:从字节码二进制文件——.class文件将类加载到内存,从而达到类的从硬盘上到内存上的一个迁移,所有的程序必须加载到内存才能工作。将内存中的class放到运行时数据区的方法区内,,用来封装方法区的数据结构。这个时候就体现出了万事万物皆对象了,干什么事情都得有个对象。就是到了最底层究竟是鸡生蛋,还是蛋生鸡呢?。2):连接:连接又分为以下小步骤验证:出于安全性的考虑,验证内存中的字节码是否符合JVM的规范,类的结构规范、语义检查、字节码操作是否合法、,或者是JVM版本冲突的问题,比如在JDK6下面编译通过的class(其中包含注解特性的类),。准备:将类的静态变量进行分配内存空间、初始化默认值。(对象还没生成呢,所以这个时候没有实例变量什么事情)解析:把类的符
深入Java虚拟机JVM类加载学习笔记 来自淘豆网m.daumloan.com转载请标明出处.