1. 简介
jvm在执行java程序的时候会将它所管理的内存划分为若干个不同的输区域,每个区域都有各自的用途。从线程的角度来分下类,jvm内存区域可以分为两类:线程私有和线程共享。
线程私有:虚拟机栈、本地方法栈和程序计数器。
线程共享:堆和方法区。
2. 具体介绍
2.1 程序计数器
程序计数器是当前线程所执行的字节码的行号提示器。简单理解就是根据这个字节码来确定下一步要干什么,比如调用哪个方法、处理哪个异常、执行哪段代码等等。
由于java多线程是轮流切换线程并分配处理器时间来实现的,在任何一个确定的时间里,处理器只能执行一个线程,因此每一个线程都已一个独立的程序计数器。
2.2 虚拟机栈
虚拟机栈是存储虚拟机方法调用时的信息,在调用虚拟机方法时,会生成一个栈帧,把调用方法的局部变量表(基本数据类型、对象引用和returnAdress类型)、操作数帧、动态链接和方法出口等信息放入栈帧,栈帧入栈到虚拟机栈,等方法执行完成时,该栈帧从虚拟机栈出栈。
2.3 本地方法栈
与虚拟机栈功能相同,只不过服务对象是本地方法。
2.4 java堆
java堆是jvm内存区域中最大的一部分,在虚拟机启动的时候创建,用于存放对象的实例。
不得不提java堆是垃圾收集器管理的主要区域。主要分为Eden、From Survivor和To Survivor空间等。而且java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可。
2.5 方法区
方法区用于存储已经被虚拟机加载的类的基本信息、常量、静态变量以及即时编译器编译后的代码等数据。可以分为永久代和运行时常量池。
运行时常量池一是用于存放编译期生成的各种字面量和符号引用,二是用于存放运行期新的常量,被利用的比较多的String类中的intern()方法。
声明
以上文字为个人理解,如有错误欢迎各位大佬批评指正,谢谢!