JVM内存结构

作者: WJoe | 来源:发表于2018-07-17 14:46 被阅读381次

JAVA内存区域

JVM在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域,包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区等。前三者为线程私有的,后两者为线程共享区域。

深入理解Java虚拟机(第二版)P39

1. 程序计数器(Program Counter Register)

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码行号指示器。
因为JVM的多线程是通过线程轮换并分配处理器执行时间来实现的,所以在任意时刻,一个处理器都只会执行一条线程中的指令。所以为了切换后能够恢复到正确的执行位置,每条线程都需要一个独立的计数器,它们互不影响。因此,程序计数器是线程私有的。
如果线程执行的是一个Java方法,计数器记录正在执行的虚拟机字节码指令的地址。如果是Native方法,能为空。

2. Java虚拟机栈(Java Virtual Machine Stacks)

Java虚拟机栈描述的是Java方法执行的内存模型: 每个方法执行的时候会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法从执行到返回,就对应一个栈帧在虚拟机栈中入栈和出栈的过程。

局部变量表

局部变量表存放的是编译期可知的各种基本数据类型、对象引用(reference类型)、returnAddress类型。其中64位长度的long和double类型数据会占用2个局部变量空间(Slot),其余只占用1个。局部变量表所需空间在变异期间完成分配,所以当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间完全确定,运行期间不会改变。

3. 本地方法栈(Native Method Stack)

本地方法栈和虚拟机栈的作用非常相似、区别在于一个执行的是Java方法,一个执行的是Native方法。
使用native关键字表示的方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由Java去调用。

4. Java堆(Java Heap)

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。这个内存区域的唯一目的就是存放对象实例以及数组。Java堆是垃圾收集器的主要区域。从内存回收的角度来看,现代收集器都是使用分代收集算法,所以可以细分为:新生代和老年代,新生代还可以分为Eden空间、From Survivor空间、To Survivor空间等。
Java堆的JVM参数主要是 -Xms和-Xmn。

5. 方法区(Method Area)

方法区和Java堆一样,是各个线程共享的内存区域,它被用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译期编译后的代码等数据

运行时常量池(Runtime Constant Pool)

运行时常量池是方法区的一部分。 Class文件中除了类的版本、字段、方法、接口等描述信息,还有常量池(Constant Pool Table),主要包括编译期生成的各种字面量(Literal)和符号引用量(Symbolic References)。字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。包括了如下三种类型的常量:

  • 类和接口的全限定名
  • 字段名称和描述符
  • 方法名称和描述符
    这部分内容在类加载后进入方法区的运行时常量池存放。
    运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用比较多的就是String类的intern()方法。
    常量池的好处
    常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
    例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
  • 节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
  • 节省运行时间:比较字符串时,==比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。
    双等号==的含义
  • 基本数据类型之间应用双等号,比较的是他们的数值。
  • 复合数据类型(类)之间应用双等号,比较的是他们在内存中的存放地址。

相关文章

  • JVM内存结构和Java内存模型

    最近看到两个比较容易混淆的概念:JVM内存结构和Java内存模型 JVM内存结构JVM内存结构或者说内存模型指的是...

  • JVM 内存结构解析

    1. JVM内存结构 (1) JDK1.7的JVM内存结构 JVM内存结构主要有三大块:堆内存、方法区和栈。 堆内...

  • JVM学习笔记

    一、JVM的结构图 1.1 Java内存结构 JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大...

  • JVM-02

    JVM内存结构

  • JVM内存模型和JVM内存结构的区别

    JVM内存模型与内存结构不是同一个概念,JVM内存结构是从运行时数据区的结构角度描述的概念,而JVM内存模型是从主...

  • 《深入理解java虚拟机》之JVM内存结构总结

    JVM内存结构 JVM内存结构不光是只有堆内存和栈内存,实际情况要复杂很多,主要包含以下结构。 程序计数器 每个线...

  • JVM

    简介 Jvm 系列一:Java类的加载机制Jvm系列二:JVM内存结构 --内存泄漏与内存溢出Jvm系列三:GC算...

  • java线程安全相关问题

    可见性问题的原因: 1.JVM内存结构: JVM的内存结构分为主内存(heap)和工作区内存。 主内存可以存放多线...

  • JVM(七):JVM内存结构

    JVM(七):JVM内存结构 在前几节的文章我们多次讲到 Class 对象需要分配入 JVM 内存,并在 JVM ...

  • java内存模型

    java代码是运行在jvm上面的,java的运行时内存结构即是jvm运行时结构。 java内存结构从内存是否共享的...

网友评论

  • honglei92:class文件常量池在哪里呢?
    WJoe:@honglei92 不是只有运行时常量池嘛? 我哪里写 Class常量池了?
    honglei92:@WJoe 你不是说有class常量池 和运行时常量池得嘛
    WJoe:什么文件常量池? 字符串常量池?

本文标题:JVM内存结构

本文链接:https://www.haomeiwen.com/subject/qalwpftx.html