jvm内存模型

JVM内存模型:

JVM内存模型包含5大模块:程序计数器,虚拟机栈(java栈),本地方法栈,java堆,方法区,这五大模块又分成2种线程模式,分别是线程私有和线程共享,其中线程私有的数据区包含:程序计数器,虚拟机栈(java栈),本地方法栈,线程共享的数据区包含:java堆,方法区。

2、线程私有

2.1、程序计数器:

它是一块较小的内存空间,可以看成是当前线程所执行的字节码的行号指示器。在虚拟机模型里,字节码解释器工作时就是通过改变这个计数器的值来选取一下一条需要执行的字节码指令,分支、循环
、跳转、异常处理、线程回复等基础功能都需要依赖计数器才能完成。

计数器是私有的是因为:

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

程序计数器值的问题:

如果线程正在执行一个java方法,这个计数器记录的是正在执行中的虚拟机字节码位置,如果正在执行的是native方法,这个计数器则为null。此内存区域是唯一一个在java虚拟机中没有定义OutOfMemoryError情况的区域。

2.2、java虚拟机栈(java栈):

java内存可以粗糙的分为堆内存(Heap)和栈内存(Stack),其中栈就是现在说的虚拟机栈,java虚拟机栈的生命周期和线程保持一致,他是存储当前线程运行方法时所需要的数据、指令、返回地址。在每个方法执行时,虚拟机都会创建一个栈帧,用于存储:局部变量表、操作栈、动态链接、方法出口等。

其中局部变量存放了编辑器可知的各种基本数据类型、对象应用和returnAddress类型(指向了一条字节码指令的地址),局部变量的大小在编辑器就已经确定了。

java虚拟机栈会出现两种异常:

OutOfMemeryError、StackOverError
StackOverError:若java虚拟机栈的内存大小不允许扩展,那么当线程深度超出了当前java虚拟机栈的最大深度时机会抛出StackOverError。
OutOfMemeryError:若java虚拟机的内存大小允许自动扩展,那么当线程请求时栈用完了,无法在动态扩展了,此时抛出OutOfMemeryError。

2.3、本地方法栈:

本地方法栈和java虚拟机栈类似区别是:
java虚拟机栈是为虚拟机执行的java方法(字节码)服务。
本地方法栈为虚拟机实现的native方法服务。

3、线程共享

3.1、堆:

在java中,堆本划分为两个不同的区域:新生代,老年代。
新生代又被划分为三个不同的区域Eden、From、Survivor、To Survivor,这样划分的目的是为了使JVM能够更好的集中管理堆内存中的对象,包括内存的分配和GC垃圾回收。如果堆中没有内存进行完成实例的的分配,并且无法再度扩展时,也会抛出OutOfMemeryError。

3.2、方法区:

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据,方法区中海包括运行常量池,和信息时常量池。

运行常量池:

存储了Class 文件中类的版本、字段、方法、接口。

信息常量池:

用于存储编译期间的各种字面常量以及符号引用,这部分内容在类加载后进入方法区的运行常量时存放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值