此篇主要用于记录JVM内存区域学习。在公司笔试题中出现率…还是比较高的。
堆与栈
从数据结构的角度说
栈是一种后进先出的线性表结构,只允许在一端进行插入与删除操作,也叫做后进先出表( Last in First Out,LIFO )。只要是符合此原则的线性表都是栈,主要的是我们的存储方式上的区别;由系统提供,快速高效,缺点是有限制,不够灵活。由系统提供。
堆是二叉树的一种。满足下列性质的数列叫做堆。将数列看做一棵完全二叉树,则堆是空树、或是一棵根节点的值大于(或小于)左右子树的根节点的值。 数据适应面广,灵活方便,效率有一定降低。由程序去申请。
Java虚拟机中主要可以分为6个内存区域:
1. 程序计数器
是当前所执行的字节码的行号指示器,为了使线程切换灵活方便。
2. 虚拟机栈
线程私有,每个方法执行时,会创建一个栈帧用于存储:
(1)局部变量表:存储基本数据类型、对象引用、returnAddress(指向一条字节码的地址)
(2)操作数栈
(3)动态链接
(4)方法出口
3. 本地方法栈
为虚拟机使用到的Native方法服务,但是在HotSpot等JVM中把它与虚拟机栈合二为一了。
4. 堆
线程共享,是JVM所管理的内存中最大的一块,(almost)所有的对象实例与数组都在堆上分配内存。
5. 方法区
线程共享,用于存储已经被JVM加载完成的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然在JVM规范中把它当做堆的一部分,但有时候要把它与堆分开来。
6. 运行时常量池
是方法区的一部分,用于存储Class文件常量池部分,在编译器生成的各种字面量与符号应用。
7. 直接内存(no)
对于多出来的直接内存是指非JVM运行时数据区的一个区域。但是也会被频繁的调用