Java虚拟机运行时内存

运行时数据区域

1.程序计数器:较小内存空间,字节码行号指示器(每个线程独立分配,线程私有)

2.Java虚拟机栈:方法运行时在虚拟机栈上创建栈帧(存储局部变量表、操作数栈、动态连接、方法出口等信息),方法执行前后相当于在栈帧在栈上的进站出站操作(生命周期同线程、线程私有),“堆栈信息”中的“栈”通常代表局部变量表。

3.本地方法栈:结构同Java虚拟机栈,作用范围不同,Java虚拟机栈针对虚拟机执行Java方法、本能方法针对native方法。

4.Java堆:虚拟机内存管理中最大的一部分(线程共享),虚拟机启动时创建,几乎所有对象实例都在堆内分配(逻辑上连续的内存空间)

5.方法区:存储被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据(非永久代回收方案)

补充:

1.局部变量表:

存放编译期可知的各种Java基本类型(boolean、byte、cahr、short、int、float、long、double)、对象引用(reference类型、可能时指对象起始地址的指针,也可能是代表对象的句柄或者其他能代表对象位置的信息)和returnAddress类型(指向一条字节码指令的地址)。

局部变量表中存储空间以局部变量槽(slot)表示,除long和double占用两个slot外、其余类型均占用一个slot。

2.运行时常量池

方法区的一部分,Class文件中有常量池表,用于存放编译期生成的各种字面量和符号引用,这部分内容存在方法去的运行常量池中。Class中符号引用翻译出的直接引用也会放在常量池中,常量池内数据具备动态性,非只有在编译期才能产生。

3.直接内存

由NIO引入,Channel使用的Buffer,可以直接使用Native函数库直接分配堆外内存,然后通过DirectByteBuffer对象作为这块内存的引用来使用,不受-Xmx等参数管控。

你可能感兴趣的:(Java虚拟机运行时内存)