本编是在学习了周志明《深入理解Java虚拟机》之后,根据章节目录的提示凭借回忆来复习和总结所学内容。

1. Java五大内存区域及作用


书中原话是: 当前线程所执行字节码的行号指示器…在字节码解释器工作时通过改变这个计数器的值来获取下一个需要执行的字节码指令。

简单理解就是:告知程序下一步所执行的指令。

java虚拟机栈 虚拟机栈的单位是 栈帧 ,栈帧中包括有

局部变量表,操作栈,动态链接,方法出口 等信息。每个栈帧代表一个方法的调用,当方法开始调用时入栈,调用完毕 出栈。


简单理解就是:命令具体的执行地点。

本地方法栈 本地方法栈的结构和作用与java虚拟机栈一样,区别是本地方法栈针对的是使用Native调用的外部方法。

简单理解就是:服务于Native方法的 “java虚拟机栈” 。


👇


直接内存 的概念: 它并不是虚拟机运行时内存的一部分,而是外部内存。作用类似对本地方法调用的一种缓冲机制,避免java堆和Native堆来回复制数据。

java堆 存放使用所有对象实例的地点,如new等创建的对象实例。对于java的GC机制主要针对的就是这个区域。

简单理解就是:存放对象实例的地方。

方法区 与反射机制有关,用来存放类的信息(也就是类生成的.class字节码文件在加载如内存后就是放在方法区),常量,静态变量,JIT编译生成的代码和数据。

👇


在方法区中还有一个非常重要的部分:运行时常量池。


它是用来存放class文件中常量池内容的地方,这些信息包括编译期生成的各种字面量和符号引用。


此外运行时常量池除了存放class文件中的常量内容外,还可以在运行过程中动态的加入内容,比如String类的intern()方法就能将这个对象的字符串添加到常量池中。


打个比方:将程序运行比作生产工作车键里的工人工作,那么程序计数器是他的日程表,java虚拟机栈是他的工作台,本地方法栈是远在海外的原材供应商,java堆则是自家仓库,方法区则可以简单看做记在脑子里的工作经验。

2. 作用范围和周期

区域

周期

范围

程序计数器

与线程相同

线程私有

java虚拟机栈

与线程相同

线程私有

本地方法栈

与线程相同

线程私有

java堆

虚拟机启动创建,关闭结束

线程共享

方法区

虚拟机启动创建,关闭结束

线程共享

其实这些内容可以从它们的作用推断出来。

程序计数器和java虚拟机栈,可以从他们的结构可以明显看出,每个线程都得有自己的内容。

对于本地方法栈,在书中并没有明确的表明他的周期和范围, 但是可以通过他和java虚拟机栈是一样的(除了是针对Native方法外),看出他的周期和范围。

java堆既然是所有对象实例共同的摇篮,那么肯定是最开放的周期和范围。

而方法区从存放常量和静态变量来看就更明显了。