Java虚拟机加载类

java之所以成功,很大程度上跟java的虚拟机有关系。java虚拟机是一个很神奇的东西。

java的类在通过javac这些命令编译成一些后缀为.class的二进制代码文件后,需要通过类加载器加载到Java虚拟机里才能够被使用。那么类是怎么被加载到虚拟机里去的。

java的类加载器有很多,最上面的有Bootstrap Class Loader,依次往下是Extension Class Loader,System Class Loader,如下图(下图来源地址:http://blog.csdn.net/bingduanlbd/article/details/8363734)


类加载器形成了一种层次结构,bootstrap class loader会去加载java api里的类,extension class loader去加载扩展类,而system class loader加载应用程序中的类,也就是classpath中配置的类。


接下来就是这些加载类是按什么方式去加载我们的类,如果我们要加载一个类,首先会去检查system class loader是否已经加载这个类,如果没有,就去更上层的class loader去找,如果找到bootstrap class loader都没有加载这个类,就会从bootstrap class loader开始往下去找哪个加载类能加载该类,找到了就会使用这个加载类来加载我们要加载的类。

当我们运行一个jvm的时候,系统会给jvm非陪一块内存区域,这块内存区域由jvm自己来管理,所以说jvm就是一个小型的操作系统,他来管理所有java程序的内存分配,已经程序运行流程控制等。这块内存被称为运行数据区域,这块内存划分为六块,java栈,程序计数器,本地方法栈,java堆,方法区域,运行常量池。前面三个是每一个线程独有的,而后面三个是所有线程都共有的。


java栈:这个是每个线程在运行的时候创建的,每一个方法调用都会对应一个栈,用来让每一个方法调用和代码段的变量都有自己的作用域,处理结果也可以由出栈来结算。

程序计数器:这个就类似于操作系统里的程序计数器。永远记录着要执行的代码的位置。

本地方法栈:这是给java native方法的栈。


java堆:放置程序创建的对象或者实例。这块区域也是java垃圾回收机制的重点区域。垃圾回收机制包括两种:1.引用计数,这个是java虚拟机每个一段时间会去java的堆栈中查询没有引用指向的对象实例,然后将其”抹掉“。2.停止复制,当引用计数久了之后会产生很多内存分配的碎片,就需要停止当前程序,然后把堆里的有效的对象重新排列下位置,让内存重新出现比较大块的区域们减少碎片。

方法区域:这个区域用于存放一些方法的字节码。

运行常量池:存放类和接口的常量。


类加载器就是把类的字节码加载到内存之后,完成对运行数据的一些初始化工作。

(PS:以上可能有失准的地方也希望大家能提出来共同学习进步)

猜你喜欢

转载自blog.csdn.net/fxjwj1997518/article/details/78022228