JVM栈和堆区别简析

经常有人把Java内存分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,Java内存区域的划分实际上远比这复杂。这种划分方式的流行只能说明这是大多数程序员最关注的、与对象内存分配关系最密切的内存区域是这两块。

1.栈

“栈”可以理解为虚拟机栈,或者虚拟机栈中的局部变量表部分。局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一个字节码指令的地址)。Java虚拟机栈是线程私有的。

2.堆

Java虚拟机规范中描述:所有的对象实例以及数组都要在堆上分配(The heap is the runtime data area from which memory for all class instances and arrays is allocated)。但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,所有对象在堆上也渐渐变得不那么“绝对”了。Java堆是所有线程共享的。

方法区:Java虚拟机规范把方法区描述为堆的一个逻辑部分(并不是真正的堆,别名:Non-Heap(非堆))。方法区储存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区是所有线程共享的。

猜你喜欢

转载自blog.csdn.net/qq_28827039/article/details/81119081
今日推荐