深入理解java虚拟机读书笔记一java运行时数据区域

java运行时数据区域:

1.程序计数器:当前线程所执行的字节码的行号指示器;

2.java虚拟机栈:每个方法执行时都会创建一个栈帧,存储局部变量表,操作数栈,动态链接,方法出口等信息。另外在线程请求栈深度大于jvm允许时会抛出stackoverflow异常(无限递归);

3.本地方法栈:和虚拟机栈功能类似,只是本地方法栈为natve方法服务;

4.java堆:java虚拟机管理的内存中的最大的一块,被所有线程共享,存放对象实例。是gc的主要区域;

5.方法区:各线程共享,存储已被虚拟机加载的类信息&常量&静态变量&即时编辑器编译后的代码。Hotspot虚拟机上,使用永久代来实现方法区(java8之前);

6.运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用,具有动态性(除了编译期的常量外,运行期间也会有新常量键入);

7.直接内存,不是jvm运行的数据区域和内存区域,但是也被频繁使用并会出现OOM。堆外内存可以直接分配使用内存,提高效率,比如NIO。

总结:java运行时数据区域包括程序计数器,java栈(包括虚拟机栈和本地方法栈),java堆,方法区(包括运行时常量池)。程序计数器保存当前线程所执行的字节码的行号指示器.java栈是线程私有的,保存局部变量表&操作数栈&动态链接&方法出口等信息。java堆是线程共享的,保存对象实例,对应新生代和老年代。方法区也是线程共享的,保存加载类信息&常量&静态变量&即时编辑器编译后的代码,对应永久代(Hotspot中)。另外NIO等方法可以直接分配堆外内存,提高效率。

你可能感兴趣的:(深入理解java虚拟机读书笔记一java运行时数据区域)