03、JVM实战:运行时数据区

*

三、运行时数据区

(面试常问)说一下JVM运行时数据区?

*

*

  • 线程私有:虚拟机栈、本地方法栈、程序计数器
  • 线程共享:堆,方法区(元空间)
(面试常问)百度:说一下JVM内存模型?分哪几个区,每个区的作用是什么?
  • 虚拟机栈:存储局部变量表、操作数栈、动态链接、方法返回地址等信息。Java方法调用。
  • 本地方法栈:本地方法调用
  • 程序计数器:记录下一条字节码执行指令,实现分支循环跳转、异常处理、线程恢复等功能。
  • 堆:所有线程共享,几乎所有对象实例都在堆中分配内存
  • 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
(面试常问)说一下JVM中堆和栈的区别?

1、 物理地址;

  • 堆:对象分配物理地址不连续,性能相对栈弱些。GC考虑分配不连续,产生算法提升性能:标记-消除,复制,标记-压缩,分代
  • 栈:先进后出,物理地址连续,性能相对堆好些。

2、 内存分配;

  • 堆:在运行时分配,大小不固定
  • 栈:在编译时分配,大小固定

3、 存放内容;

  • 堆:对象的实例和数组,更关注:数据存储
  • 栈:局部变量,操作数,动态链接,方法返回地址等信息,更关注:程序方法的执行

4、 程序可见性;

  • 堆:所有线程共享,可见
  • 栈:线程私有,只对线程可见,生命周期和线程相同
深拷贝与浅拷贝

浅拷贝:增加一个指针指向已有的内存地址

深拷贝:增加一个指针指向新开辟的一块内存空间

  • 原内存发生变化,浅拷贝也随之变化;深拷贝则不会随之改变

静态变量–>方法区

静态对象–>堆