JAVA内存区域
内存区域 | 线程 | 生命周期 | 作用 |
---|---|---|---|
程序计数器 | 私有 | 线程 | 指向执行的字节码指令的行号 |
虚拟机栈 | 私有 | 线程 | 存放局部变量、操作数栈、动态链接、方法出口等信息 |
本地方法栈 | 私有 | 线程 | 类似虚拟机栈,为本地方法服务 |
方法区 | 共享 | 虚拟机 | 存放类信息、常量、静态变量、全局变量和即时编译器编译的代码 |
堆 | 共享 | 虚拟机 | 存放实例对象与数组 |
-
全局变量与局部变量为什么分别放在不同的地方?
答:全局变量为类的变量,随着类的存在而存在(加载,消亡),因此存放在堆中。局部变量在方法中,随着方法的存在而存在,而方法只有线程调用时才存在,因此存放在虚拟机栈中 -
操作数栈
Desc:虚拟机栈中用于计算的临时数据存储区
堆
1.新生代:
- Eden:新生的对象被放置在伊甸园中自由快乐的生活
- Survivor Space 0(From Survivor):调用GC后幸存的对象放置在其中
- Survivor Space 1(To Survivor):调用GC后幸存的对象放置在其中
PS:From与To并不是逻辑关系,谁存放了对象谁就是From
2.老年代
S0与S1相互转换,对象从Eden 复制到Survivor Space 或者从Survivor Space 之间复制,计数器会自动增加其值。 默认情况下如果复制发生超过16次,JVM 就会停止复制并把他们移到老年代中去。
方法区(Non-Heap)
- 永久代与方法区的概念
Desc:HotSpot在jdk1.8中移除了永久代(Permanent Generation)的概念。将原本用永久代来实现的方法区改在元空间实现。
首先,元空间不使用堆内存,使用本地内存,因此不会出现内存溢出问题。
其次,避免了full GC时永久代数据移动消耗的性能。