3妹:“如果你突然打了个喷嚏 那一定就是我在想你。如果半夜被手机吵醒 啊那是因为我关心……”
3妹正在一遍又一遍地唱着王心凌的《爱你》
2哥:3妹,甜心教主的这首歌你今天已经唱了快20遍了,现在该学习了吧?
3妹:哈哈哈,这首歌多好听啊,我再唱最后一遍。
2哥:今天我们来学习下JVM相关的知识。
讲课初始JVM
JVM(Java Virtual Machine)即Java虚拟机,是一种用于计算设备的规范,由名字可以知道,它是一个虚构出来的计算机,是通过仿真模拟各种计算机功能来实现的。
JVM主要是将Java字节码和操作系统之间进行一层转换,从而使Java可以跨平台。
JVM内存区域怎么划分的?
运行时数据区域包含以下五个区域:
程序计数器
Java虚拟机栈
本地方法栈
堆
方法区
其中程序计数器、虚拟机栈、本地方法栈各线程私有,相互独立,堆和方法共所有线程共享
线程私用的部分(Java虚拟机栈,本地方法栈,程序计数器)
程序计数器
计数器存储了当前线程正在执行的字节码指令的地址(如果是当前执行的是Native方法,那么计数器为空),字节码解释器就是通过改变计数器的值来选取下一条需要执行的字节码指令。程序计数器是线程私有的,便于各个线程切换后,可以恢复到正确的执行位置。
Java虚拟机栈
执行一个Java方法时,虚拟机都会创建一个栈帧,来存储局部变量表,操作数栈等,方法调用完毕后会对栈帧从虚拟机栈中移除。
局部变量表中存储了Java基本类型,对象引用(可以是对象的存储地址,也可以是代表对象的句柄等)和returnAddress类型(存储了一条字节码指令的地址)。
本地方法栈
本地方法栈与Java虚拟机栈类似,只不过是执行Native方法(C++方法等)。
线程共享的部分(堆,方法区)
堆
堆存储了几乎所有对象实例和数组,是被所有线程进行共享的区域。在逻辑上是连续的,在物理上可以是不连续的内存空间(在存储一些类似于数组的这种大对象时,基于简单和性能考虑会使用连续的内存空间)。
方法区
存储了被虚拟机加载的类型信息,常量,静态变量等数据,在JDK8以后,存储在方法区的元空间中(以前是存储在堆中的永久代中,JDK8以后已经没有永久代了)。
运行时常量池是方法区的一部分,会存储各种字面量和符号引用。具备动态性,运行时也可以添加新的常量入池(例如调用String的intern()方法时,如果常量池没有相应的字符串,会将它添加到常量池)。
直接内存区(不属于虚拟机运行时数据区)
直接内存区不属于虚拟机运行时数据区的一部分。它指的是使用Native方法直接分配堆外内存,然后通过Java堆中的DirectByteBuffer来对内存的引用进行操作(可以避免Java堆与Native堆之间的数据复制,提升性能)。
网友评论