java内存运行时区域模型,JVM内存模型(运行时数据区)

一、JVM的运行制概要

如果要运行Java程序,首先要编写Java的源文件(*.java)之Java的编译器将源文件编译成对应的字节码文件(*.class文件),之后再通过类加载器将字节码文件(*.class)加载到jvm中,其中在 jvm 中与程序运行最密切的是运行时数据区( Runtime data area)。

d4fcb109ef486d2801d877181159750b.png

要把class文件加载到jvm中的运行时数据区进行处理。

二、运行时数据区(JVM内存模型)

程序的运行最为重要的一块区域就是运行时数据区,其中运行时数据区可以分为如下几个子区域:

8dce69c19c16dba73b0d5823cb619a6c.png

程序计数器:

程序计数器是用于存放下一条指令所在单元的地址的地方。

程序执行必须知道指令(计算机要通过指令才能执行),此时就需要从程序计数器中读取即将执行的指令的地址,通过这个地址就可以得到指令从而执行。

比如线程即将执行一个Java方法,此时要先从程序计数器中取得即将执行的虚拟机字节码指令的地址。

虚拟机栈:

该区域是线程私有的,虚拟机栈的生命周期和线程相同,在执行一个Java方法的时候会在该区域创建一个栈帧,栈帧用来保存局部变量表(在方法中定义的变量或者方法的参数都是方法的局部变量)、动态链接、方法出口、操作数栈等等信息,其实每个方法从执行到执行完毕就是一个入栈与出栈的过程。当入栈的速度大于出栈的速度的时候会出现栈内存溢出( Exception in thread "main" java.lang.StackOverflowError)。

本地方法栈:

本地方法栈和虚拟机栈的作用很相似,不同点是虚拟栈是为Java方法服务的,本地方法栈是为native方法服务的(这种本地方法是没有方法体的,可以算是一个抽象方法,具体的实现是本地操作系统的c语言写的一些函数库中的方法实现的)

堆:

堆是运行时数据区中最大的一块子区域,创建的实例对象和数组都需要在堆内存开辟空间,堆空间是线程共享的区域,该区域也是gc (垃圾回收)重要从狸的一个区,所以堆又被称为“GC堆”。

方法区:

永久代实现了方法区,永久代是在JDK1.8之前出现的概念,在JDK1.8开始就没有了永久代,而是使用了元空间代替了。

方法区也是一块线程共享的区域,该区域主要保存的是已经加载到jvm 中的类的信息、常量、静态变量等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值