Java之JVM内存结构

JVM

Java虚拟机(Java Virtual Machine)是一种抽象计算机。与真正的计算机一样,它有一个指令集,并在运行时操作各种内存区域。

JVM不关心使用上面编程语言,如Clojure、Groovy、 JRuby、Jython 、Scala,等等。只要这些语言在编译后变为class文件,都可以在JVM上运行。即JVM只关注class文件。使用Java编译器可以把.Java代码编译为存储字节码的class文件,c使用JRuby等其他语言的编译器一样可以把程序代码编译成class文件,虛拟机并不关心Class的来源是什么语言,只要它符合class文件应有的结构就可以在Java虚拟机中运行。

class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件之中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若千个8位字节进行存储。

Java的内存主要划分成为5个部分

区域名称作用
PC寄存器给CPU使用,与我们开发无关。
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区存储可以运行的class文件。包含静态区。
堆内存存储对象或者数组,new来创建的,都存储在堆内存。
方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

在这里插入图片描述

各个数据区详解

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。一些数据区域是在Java虚拟机启动时创建并在Java虚拟机退出时销毁。另一些数据区域为每个线程运行区,每个线程数据区域在线程创建时创建,在线程退出时销毁。

1、程序计数器(Program Counter Register)
Java虚拟机可以支持同时执行多个线程。每个Java虚拟机线程都有自己私有的PC(程序计数器)寄存器。

字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

由于Java虛拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储。

2、Java虚拟机栈(Java Virtual Machine Stacks)
每个Java虚拟机线程都有一个与线程同时创建的私有Java虚拟机堆栈。

Java虚拟机栈类似于C等传统语言的栈;每个方法被执行的时都会创建一个栈帧(Stack Frame
),即一个临时分配的一个内存空间,用于保存局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

局部变量表存放了编译期可知的各种基本数据类型和对象引用(理解:对象引用不是对象本身,类似一个指针,指向一个实际对象的起始地址)。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

3、堆(Heap)
Java虚拟机有一个堆,在所有Java虚拟机线程之间共享。堆是运行时数据区域,为所有类实例和数组对象分配内存

堆在虚拟机启动时创建。对象的堆存储由自动存储管理系统(称为垃圾收集器)回收;对象永远不会显式地释放。

4、方法区(Method Area)
Java虚拟机有一个在所有Java虚拟机线程之间共享的方法区域。

方法区域类似于C等传统语言编译后代码的存储区域,或类似于操作系统进程中的“文本”段。它存储每个类的结构,比如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括在类和实例初始化以及接口初始化中使用的特殊方法。

5、运行时常量池(Run-Time Constant Pool)
每个运行时常量池都是从Java虚拟机的方法区域分配的,Java1.8后的字符串常量池移到了堆中。

类或接口的运行时常量池是在Java虚拟机创建类或接口时构建的。

6、本地方法栈(Native Method Stacks)
Java虚拟机的实现可以使用传统的栈(通俗地称为“C栈”)来支持本地方法(用Java编程语言以外的语言编写的方法)。

参考:
《深入理解Java虚拟机——JVM高级特性与最佳实践,周志明》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值