先看《Java编程思想》的介绍
程序运行时,有五个不同的地方可以存储数据,分别是:寄存器、堆栈、堆、常量存储、非RAM存储,以下逐个说明:
一)寄存器。这是最快的存储区,位于处理器内部。空间极小,不能被直接控制(C和C++ 可以向编译器建议寄存器的分配方式)。
二)堆栈。位于通用RAM中,速度仅次于寄存器,要求存储的数据需要有明确的生命周期。一般用来存储基本数据类型和对象的引用。
三)堆。位于RAM中,用于存放所有的java对象。没有明确的生命周期,灵活性高,编译器不需要知道存活时间,所占空间由GC回收。速度比堆栈慢。
四)常量存储。用于存放直接常量,执行代码中出现的字面基本类型和直接字符串都存在此处。
五)非RAM存储。序列化对象,可以将对象存储在磁盘上,可以通过Internet进行对象的传输。
再看JVM的说明
JVM中把内存分的更细,不同JVM对内存的划分还不一样,这里只说JVM规范里声明的几种。
1、程序计数器:非常小,用于指示下一条需要执行的字节码指令
2、虚拟机栈:java方法运行时的栈
3、本地方法栈:本地方法运行时的栈
-------------------------------------------------------------------------------------------------------------
4、java堆:就是熟悉的堆空间
5、方法区: 常量池也属于此位置
6、直接内存:JDK1.4添加了nio,增加了此部分内存
虚线以上的三个隶属于线程,它们随着所在线程的消亡而消亡。