课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
java虚拟机是我们在学习java编程开发技术的时候需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,java虚拟机类加载与运行时数据区域。
一、类加载系统
类加载系统分为三个阶段,分别是加载,链接和初始化。
加载大家都很清楚了,java中有个专门的ClassLoader来负责这个事情。除了加载Class之外,ClassLoader还可以用来加载resources。
在JDK9之前,系统默认有三个类加载器,分别是:
1、BootstrapClassLoader
这个类加载器主要是加载/jre/lib下面的rt.jar,并且这个类加载器是用C/C++来编写的,并且它是后面ExtensionClassLoader的父ClassLoader。
这个类应该在java代码中找不到的(correctmeifIamwrong!)。
2、ExtensionClassLoader
这个类加载器主要加载JDK的扩展类/jre/lib/ext,它的实现类是sun.misc.Launcher$ExtClassLoader:
3、SystemClassLoader
这个加载器是加载定义在ClassLoader中的类。它的实现类是sun.misc.Launcher$AppClassLoader,这个类的实现很长,这里就不完整列出来了:
Linking阶段主要做了三件事情:
Verification–主要验证字节码文件的结构的正确性,如果不正确则会报LinkageError。
Preparation–负责创建staticfields,并且初始化他们的值。
Resolution–把类型的常量池中引用的类,接口,字段和方法替换为直接引用的过程。
Initialization阶段主要是调用class的父类和自身的初始化方法,来设置变量的初始值。
二、运行时数据区域
类加载好了,也初始化了,接下来就可以准备运行了。
运行的时候要为数据分配运行空间,这就是运行时数据区域的作用。
运行时数据区域又可以分为5个部分:
1、MethodArea
方法区是非Heap的内存空间,主要用来存放class结构,staticfields,method,method’sdata和staticfields等。方法区是在JVM启动的时候创建的,并且在所有的线程中共享。
2、HeapArea
HeapArea主要存储类对象和数组。垃圾回收器(GC)主要就是用来回收HeapArea中的对象的。
3、StackArea
因为是栈的结构,所以这个区域总是LIFO(Lastinfirstout)。我们考虑一个方法的执行,当方法执行的时候,就会在StackArea中创建一个block,这个block中持有对本地对象和其他对象的引用。一旦方法执行完毕,则这个block就会出栈,供其他方法访问。
4、PCRegisters
PCRegisters主要用来对程序的执行状态进行跟踪,比如保存当前的执行地址,和下一步的地址等。
5、NativeMethods
后一个就是本地方法区了,因为JVM的底层很多都是由C/C++来实现的,这些方法的实现就构成了本地方法区。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。