JVM

Posted 保护眼睛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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文件除了有类的版本、字段、方法、接口等信息描述外,还有一项信息就是常量池表,用于存放编译时期生成的各种字面量与符号引用,这部分内容将在类加载后存放到到方法区的运行时常量池中。

以上是关于JVM的主要内容,如果未能解决你的问题,请参考以下文章

jvm基础--JVM参数配置

jvm基础--JVM内存模型

jvm基础--JVM内存模型

JVM基础:深入学习JVM堆与JVM栈(转)

JVM堆与JVM栈

JVM内存管理和JVM垃圾回收机制