jvm在运行Java程序时,会有把内存分成如下几个区域:
clipboard.png

区域 线程私有/共享 主要用途
程序计数器 私有 可以看作是当前线程执行的字节码行号指示器,字节码解释器会通过改变程序计数器的值来记录下一条需要执行的字节码命令分支、循环、跳转、线程恢复都需要依赖程序计数器来完成
虚拟机栈 私有 Java方法执行的内存模型:每个方法运行时都会创建一个栈帧,用于存储局部变量表(常见的各种基本数据类型以及对象引用)、操作数栈动态链接方法出口等信息;方法开始执行时,栈帧入栈;方法结束时,栈帧出栈
本地方法栈 私有 和虚拟机栈类似,虚拟机栈为虚拟机执行的java方法(字节码方法)服务,本地方法栈则是为虚拟机执行的Native方法服务;HotSpot虚拟机则把本地方法栈和虚拟机方法栈直接合到了一起
堆内存 共享 1. 虚拟机内存中最大的一块,所有线程共享;堆内存唯一的目的就是存放对象实例(对象或数组)
2. 同时堆内存也是垃圾回收器管理的主要区域,所以也被称作(gc堆);
3.堆内存可以分为新生代:Eden、Survivor(From、To)和老年代
方法区 共享 用于存储已经被加载类信息、常量、静态变量、即时编译器编译后的代码等
运行时常量池 共享 运行时常量池是方法区的一部分:Class文件中除了有类的版本、字段、方法、接口等基本信息外,还包括一项常量池,用来存放编译期生成的各种常量符号引用(虚拟机类加载的解析阶段会将常量池中的符号引用替换为直接引用)

参考资料:《深入理解Java虚拟机》- 周志明


瓦力
575 声望15 粉丝

一只coder