三、运行时数据区
(面试常问)说一下JVM运行时数据区?
- 线程私有:虚拟机栈、本地方法栈、程序计数器
- 线程共享:堆,方法区(元空间)
(面试常问)百度:说一下JVM内存模型?分哪几个区,每个区的作用是什么?
- 虚拟机栈:存储局部变量表、操作数栈、动态链接、方法返回地址等信息。Java方法调用。
- 本地方法栈:本地方法调用
- 程序计数器:记录下一条字节码执行指令,实现分支循环跳转、异常处理、线程恢复等功能。
- 堆:所有线程共享,几乎所有对象实例都在堆中分配内存
- 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
(面试常问)说一下JVM中堆和栈的区别?
1、 物理地址;
- 堆:对象分配物理地址不连续,性能相对栈弱些。GC考虑分配不连续,产生算法提升性能:标记-消除,复制,标记-压缩,分代
- 栈:先进后出,物理地址连续,性能相对堆好些。
2、 内存分配;
- 堆:在运行时分配,大小不固定
- 栈:在编译时分配,大小固定
3、 存放内容;
- 堆:对象的实例和数组,更关注:数据存储
- 栈:局部变量,操作数,动态链接,方法返回地址等信息,更关注:程序方法的执行
4、 程序可见性;
- 堆:所有线程共享,可见
- 栈:线程私有,只对线程可见,生命周期和线程相同
深拷贝与浅拷贝
浅拷贝:增加一个指针指向已有的内存地址
深拷贝:增加一个指针指向新开辟的一块内存空间
- 原内存发生变化,浅拷贝也随之变化;深拷贝则不会随之改变
静态变量–>方法区
静态对象–>堆