JVM 运行数据区
1.java虚拟机堆栈
每个Java虚拟机线程都有一个私有Java虚拟机堆栈,与线程同时创建。Java虚拟机堆栈的内存不需要是连续的。
2.栈
存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。
int a=5;//此时的基本类型的数据就存放在栈中
String s="hello world";//解释如图
3.堆
Java虚拟机具有在所有Java虚拟机线程之间共享的堆。堆是运行时数据区,从中分配所有类实例和数组的内存。
堆是在虚拟机启动时创建的。对象的堆存储由自动存储管理系统(称为垃圾收集器)回收 ; 对象永远不会被显式释放。Java虚拟机假设没有特定类型的自动存储管理系统,可以根据实现者的系统要求选择存储管理技术。堆可以具有固定大小,或者可以根据计算的需要进行扩展,并且如果不需要更大的堆,则可以收缩。堆的内存不需要是连续的。
4.方法区
Java虚拟机具有在所有Java虚拟机线程之间共享的方法区域。方法区域类似于传统语言的编译代码的存储区域或类似于操作系统进程中的“文本”段。它存储每类结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的特殊方法
方法区域是在虚拟机启动时创建的。虽然方法区域在逻辑上是堆的一部分,但是简单的实现可能选择不垃圾收集或压缩它。本规范未规定方法区域的位置或用于管理编译代码的策略。方法区域可以是固定大小的,或者可以根据计算的需要进行扩展,并且如果不需要更大的方法区域,则可以缩小方法区域。方法区域的内存不需要是连续的。
5.运行时常量池##
运行时常量池包含于方法区。
6. 本机方法堆栈##
java虚拟机的实现可以使用常规堆栈(俗称“C堆栈”)来支持native方法(用Java编程语言以外的语言编写的方法)。本机方法堆栈也可以通过以诸如C语言的Java虚拟机的指令集的解释器的实现来使用。无法加载native 方法并且本身不依赖于传统堆栈的Java虚拟机实现不需要提供本机方法堆栈。如果提供,则通常在创建每个线程时为每个线程分配本机方法堆栈。