Java在内存分配区域:栈区(stack)、堆区(heap)、方法区(Method Area)、常量池。
一、栈区
- 每个方法(Method)执行时,都会创建一个方法栈区。用于存储局部变量表、操作数栈、动态链接、方法出口信息等
- 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)。对象都存放在堆区中。
- 每个战中的数据(基础数据类型和对象引用)都是私有的,其他栈不能访问。
- 栈分为3个部分:基本类型变量,执行环境上下文,操作指令区(存放操作指令).
- 存在栈中的数据可以被栈内的变量共享。
二、堆区
- 堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
- 堆内存是被所有线程共享的一块内存区域,在虚拟机启动时创建。
- 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放,实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!
- 而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉),这也是Java比较占内存的原因。
三、方法区
方法区跟堆一样,又被称为静态区,通常存放常量数据。它存储已被Java虚拟机加载的类元数据、常量、静态变量、存储的方法(Method),它跟堆一样,被所有的线程共享。
四、常量池
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。
除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法和名称和描述符。
在程序执行的时候,常量池会储存在方法区(Method Area),而不是堆中。
原文链接:https://blog.csdn.net/joshua317/article/details/121238327
java - 1.JVM中的五大内存区域划分详解及快速扫盲 - 个人文章 - SegmentFault 思否