JVM内存结构细节详解

在这里插入图片描述
在这里插入图片描述

静态(class文件)常量池和动态(运行时)常量池的关系以及区别
静态常量池存储的是当class文件被java虚拟机加载进来后存放在方法区的一些字面量和符号引用,字面量包括字符串,基本类型的常量,符号引用其实引用的就是常量池里面的字符串,但符号引用不是直接存储字符串,而是存储字符串在常量池里的索引。

动态常量池是当class文件被加载完成后,java虚拟机会将静态常量池里的内容转移到动态常量池里,在静态常量池的符号引用有一部分是会被转变为直接引用的,比如说类的静态方法或私有方法,实例构造方法,父类方法,这是因为这些方法不能被重写其他版本,所以能在加载的时候就可以将符号引用转变为直接引用,而其他的一些方法是在这个方法被第一次调用的时候才会将符号引用转变为直接引用的。

方法区和堆空间是线程之间共用的。方法区在 JDK8 之后被称为元空间。
程序计数器,本地方法栈,虚拟机栈都是每个线程独立保存一份的。

程序计数器

PC 程序计数器用来存放下一条指令的地址。帮助执行引擎读取下一条指令。
程序计数器是一块很小的内存空间,几乎可以忽略不计,也是运行速度最快的存储区域。
在 JVM 规范中,每个线程都有自己的程序计数器,是每个线程私有的。生命周期和线程的生命周期一致。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。它是唯一一个在Java虚拟机规范中没有规定任何OutOtMemoryError情况的区域。 没有 OOM,也没有 GC 问题。

Java虚批机桟(Java Virtual Machine stack)

,早期也叫Java栈。毎个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的桟幀(stack Frame) ,对应着一次次的Java方法調用。Java 虚拟机栈是线程私有的;
作用和特点:
Java 虚拟机使用虚拟机栈来实现跨平台性的设计,Java 的指令都是根据栈来设计的。不同的平台的CPU 架构不同,所以不能设计为基于寄存器的指令集。
java 虚拟机栈主管java 程序的运行,保存方法的局部变量(8 种基本数据类型或者引用类型),部分结果并参与方法的调用和返回。
优点是跨平台,指令集小;编译器容易实现
缺点是性能下降,需要更多的指令来实现一个功能。
对于栈来说不存在垃圾回收问题,但是存在OOMoutofmemory
栈和堆的关系
虚拟机栈是运行时的单位,而堆是存储的单位。
虚拟机栈的常见异常
Java虚拟机规范允许Java栈的大小是动态的或者是固定不变的。
如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量
可以在线程创建的时候独立选定。如果线程使用的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常。如果是物理机内存不足了,那么就是OutOfMemoryError异常。
如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那么就会抛出OutOfMemoryError异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值