JVM内存模型

今天来聊聊JVM的“成分”。
作为一个刚毕业不到一年的程序员,就开始想着去面java中级开发,真的是有点癞蛤蟆想吃天鹅肉。既然是面对java中级开发的面试,JVM已经变成了基础。
在这里插入图片描述

JAVA代码执行的过程

首先通过类加载器把java代码转成字节码,运行时数据区再把字节码加载到内存中,而字节码文件只是JVM的一套操作规范,并不能直接交给计算机去执行(因为计算机不认识字节码啊),需要执行引擎去解析,将字节码文件翻译成计算机可识别的系统指令,再交给CPU去执行。而在这个过程中,需要调用其他语言的本地库接口来实现整个程序的功能。

JVM内存模型

在这里插入图片描述

程序计数器

别看上面程序计数器画得那么大一块,实际上程序计数器是一块比较小的空间。

它是用来记录当前线程执行到了哪一个位置,记录当前线程执行到达的行号指示器。

字节码解释器工作的时候,就是通过改变这个计数器的值来获取到下一条需要执行的字节码,比如循环、分支、跳转、异常处理、线程恢复等这一系列基础的操作都需要依赖这个程序计数器。

每个线程都有自己的计数器,互不影响,用来记录各自执行字节码的位置,程序计数器是线程私有的。

虚拟机栈

在这里插入图片描述

虚拟机栈描述的是java方法执行的内存模型,这里的java方法是指程序员在代码里写的java方法,在每个方法执行的时候,都会创建一个“栈帧”。

这个栈帧用来保存局部变量,操作数栈、动态链接,方法出口等信息。一个方法从调用到执行完成,都对应着一个栈帧从入栈到出栈的过程。当一个方法执行完成的时候,方法对应的栈帧就会弹出栈帧的元素作为方法的返回值,并且清除这个栈帧。

java栈的栈顶的栈帧就是当前正在执行的方法,方法之间的调用,其实就是栈帧的切换过程。

这里可能会抛出两种异常,常见于递归算法:
StackOverflowError : 当线程请求的最大深度超出虚拟机允许的深度时。
OutOfMemoryError: 如果虚拟栈可以动态扩展,在扩展时无法申请到足够的内存时。

本地方法栈

本地方法栈跟上面的虚拟机栈很相似,但是,虚拟机栈是为java方法(即字节码)服务的,本地方法栈是为虚拟机使用到的Native方法服务的

何为Native方法?简单说就是一个不是用java代码写的方法。本地方法栈就是为了虚拟机调用非java代码编写的接口服务。

方法区

方法区是被所有线程共享的区域。用来存储已经被虚拟机加载的类信息、常量、静态变量,以及运行时常量池(存放编译期间生成的各种字面常量)

当然,如果存放的东西超出了这块区域所拥有的内存大小,就会报出OutOfMemoryError的异常。在java8之后方法区已经被废弃,使用元空间取代。

堆也是被所有线程共享的区域,也是OutOfMemoryError异常的主要事故区,这里也是虚拟机中被分配空间最大的一块。

堆中存储这几乎所有的实例对象,这里也是垃圾回收器的工作区域。如果无休止创建大量的对象,当消耗完所有内存空间,GC之后无法继续为新的对象分配内存空间的时候,就会发生OOM

堆的内存可以通过-Xms设置初始值、-Xmx设置最大值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值