博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM(一)
阅读量:3967 次
发布时间:2019-05-24

本文共 1134 字,大约阅读时间需要 3 分钟。

JVM运行时数据区域

在这里插入图片描述

程序计数器

程序计数器是一块较小的内存空间,它可以被看作是当前线程所执行的字节码的行号指示器。字节码解释器就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成。

程序计数器是线程私有的内存。Java多线程是通过线程的轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一个独立的程序计数器,各条线程之间的计数器互不影响,所以称为"线程私有的内存"。没有OOM情况。

JVM栈

与程序计数器一样,JVM栈也是线程私有的。它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行时,Java虚拟机就会同步创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法返回地址(方法出口)等信息。

局部变量表:存放了编译时期可以可知的Java虚拟机基本数据类型(八大基本数据类型)和对象引用(reference类型,不等同与对象本身)。
操作栈:它是每个方法都会生成的栈
动态链接:指向字符串常量池
方法的返回地址:pc寄存器的地址

本地方法栈

本地方法栈与虚拟机栈所发挥的作用十分相似,其区别就是Java虚拟机栈是为Java方法来服务的(也就是字节码),而本地方法栈它是为JVM使用到的本地(Nativa)方法来服务的。也是线程私有的。

栈深度溢出和栈扩展失败时也会抛出StackOverFlowError和OOM异常。

Java堆

堆区是所有线程共享的一块内存区域,所有创建对象的信息都在这个区域,堆也是JVM最大的一块内存。

堆在JVM启动时创建,此内存的唯一目的就是为了存放对象实例。java堆是垃圾收集器管理的内存区域,也被称为"GC堆"。Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的,这就像我们的磁盘空间去存储文件一样,并不要求每个文件都连续存放。Java堆既可以被设置为固定大小的,也可以是扩展的(通过-Xmx和Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法在扩展的时候,就会有outofmemoryerror异常。

方法区

方法区也叫永久代,JDK1.8叫元空间。与Java堆一样,是各个线程共享的内存区域。方法区存储了已经被JVM加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

会有OOM异常。
运行时常量池:是方法区的一部分。Class文件除了有类的版本、字段、方法、接口等信息描述外,还有一项信息就是常量池表,用于存放编译时期生成的各种字面量与符号引用,这部分内容将在类加载后存放到到方法区的运行时常量池中。

转载地址:http://bpcki.baihongyu.com/

你可能感兴趣的文章
3-python之PyCharm如何新建项目
查看>>
15-python之while循环嵌套应用场景
查看>>
17-python之for循环
查看>>
18-python之while循环,for循环与else的配合
查看>>
19-python之字符串简单介绍
查看>>
20-python之切片详细介绍
查看>>
P24-c++类继承-01详细的例子演示继承的好处
查看>>
P8-c++对象和类-01默认构造函数详解
查看>>
P1-c++函数详解-01函数的默认参数
查看>>
P3-c++函数详解-03函数模板详细介绍
查看>>
P4-c++函数详解-04函数重载,函数模板和函数模板重载,编译器选择使用哪个函数版本?
查看>>
P5-c++内存模型和名称空间-01头文件相关
查看>>
P6-c++内存模型和名称空间-02存储连续性、作用域和链接性
查看>>
P9-c++对象和类-02构造函数和析构函数总结
查看>>
P10-c++对象和类-03this指针详细介绍,详细的例子演示
查看>>
ksh 命令分隔符
查看>>
sed 精萃
查看>>
awk 精萃
查看>>
awk 注释
查看>>
GROUPING SETS、ROLLUP、CUBE
查看>>