深入理解Java 虚拟机阅读笔记(一)

jvm运行数据区域

深入理解Java 虚拟机阅读笔记(一)


1、 程序计数器

占用空间:较小
作用:字节码行号指示器
作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复)
特点:线程私有(每个计数器独立计算,上下文相互独立)。

2、虚拟机栈

占用空间:依据栈空间设定
作用:java 方法执行的内存模型。
作用详情:每个方法执行时都会创建栈桢。用于储存局部变量表、栈操作数、动态链接、方法出口等信息。每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈的过程
特点:线程私有

3、本地方法栈

本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是十分相似的,他们之间的区别不过是虚拟机栈为Java方法字节码服务,而本地方法栈则为Native方法服务。在虚拟机规范中对本地方法使用的语言和使用方法与数据结构没有强制规定,因此具体的虚拟机可以*实现它。

4、堆

堆是java 虚拟机中最大的一块。
作用:存放对象实例
特点:线程共享。
可能出现问题:内存泄漏,多线程引用抢占。
虚拟机解决方案:GC回收,cas重试机制锁。

5、方法区

作用:用于存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
特点:线程共享。

6、常量池

作用:是方法区的一部分,用于存放编译器生成的各种字面量和符号引用,这些内容将在类加载后进入方法区存放。
特点:相对于Class文件常量池的另外一个重要特征是具有动态性,运行期间也可能有新的常量池放入持重,比如String.intern()方法

7、直接内存

不属于虚拟机中定义的内存区域,而是堆外内存。
nio 可以直接操作堆外内存