Java - 类加载器 和 JVM

来源:互联网 发布:mac 如何打破折号 编辑:程序博客网 时间:2024/06/15 07:02

类加载器

JVM理论
Java语言一个重要特点是与平台无关,因为不同平台有自己的JVM,JVM执行字节码文件时,把字节码文件解释成具体平台上的机器指令JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际计算机上仿真模拟各种计算机功能来实现的JVM是Java程序的运行环境,也是操作系统的一个进程,因此他有自己的运行生命周期,也有自己的代码和数据空间JVM在整个JDK中处于最底层,负责和操作系统交互,用来屏蔽操作系统环境,提供完整的Java运行环境
JVM执行程序的过程
加载字节码文件管理并分配内存执行垃圾收集



JVM组成

寄存器:我们在程序中无法控制栈:存放基本数据类型和对象引用堆:存放使用new产生的数据静态域:存放对象中使用static定义的静态成员常量池:存放常量非RAM存储:硬盘等永久存储空间

常量池

常量池是在编译期被确定,并保存在已编译的字节码文件中JVM必须为每个被装载的类维护一个常量池常量池存放基本类型,对象类型的常量值(final),还有一些文本形式出现的符号引用类和接口的全限定名字段的名称和描述符方法的名称和描述符常量池中有一个固定长度的CONSTANT_String_info表他存放String常量的值,不存储符号引用在程序执行的时候,常量池存储在Method Area,不是在堆中

栈中存放基本数据类型的变量数据和对象的引用栈的基本单位是帧java线程运行时,JVM会为每个线程分配一个java栈,该线程执行某个java方法时,向栈压入一个帧,这个帧用于存储参数,局部变量,操作数,中间运算结果等,当方法执行完的时候,帧会从栈中弹出,java栈上的所有数据都是私有的,其他线程都不能访问该线程的栈数据栈中的变量退出作用域后,java会自动释放掉该变量所分配的内存空间栈的优点存储速度比堆快,仅次于寄存器,栈数据是可以共享的栈的缺点存储在栈中的数据大小,生命周期必须是确定的,缺乏灵活性栈中数据共享的意思是值共享,例如int a=3;int b=3;意思是a引用和b引用都指向栈中的同一个3

堆中存放new创建的对象和数组在堆中分配的内存,由JVM自动的垃圾回收机制来管理堆主要用来存放对象和数组,栈主要用来存放对象和数组的引用,在堆中产生一个对象和数组后,还可以在栈中定义一个特殊变量,让栈中的这个变量的取值等于对象和数组在堆内存中的首地址,栈中的这个变量就成了对象和数组的引用变量当没有引用变量指向对象或数组时,对象或数组就成了垃圾,对象或数组占的内存不会自动释放,在之后不确定的时间被垃圾回收器释放这也是java比较占内存的原因堆的优点java堆是一个运行时的数据区,运行期可以动态分配内存大小,自动释放垃圾所占内存空间堆的缺点运行期动态分配内存,存取速度慢