JVM内存初探

JVM只设置了4个最为常用的寄存器

pc程序计数器

optop操作数栈顶指针

frame当前执行环境指针

vars指向当前执行环境中的第一个局部变量的指针


所有寄存器均为32位

pc用于记录程序的执行,optop、farme和vars用于记录指向Java栈区的指针



Java虚拟机的内存划分以其各个区域的功能

(1)程序计数器   线程私有
每一个Java线程都有一个程序计数器来用于保存程序执行到当前方法的哪一个指令,对于非Native方法,这个区域记录的是正在执行的VM原语的地址,如果正在执行的是Natvie方法,这个区域则为空(undefined)。
生命周期与线程相同。
此内存区域是唯一一个在VM Spec中没有规定任何OutOfMemoryError情况的区域。
(2)Java虚拟器栈 线程私有   存取速度仅次于寄存器,快于堆
VM栈的生命周期也是与线程相同。每个线程包含一个栈区,栈中只保存基本数据类型的对象和自定义对象的引用(不是对象)也用来保存加载方法时的帧。每个栈中的数据都是私有的,其他栈不能访问,栈中的数据可以共享。
每个方法被执行时,都会同时创建一个帧(Frame)用于存储本地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个帧在VM栈中的入栈至出栈的过程。
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
VM栈可以动态扩展,如果扩展到无法申请到足够内存,则抛出OutOfMemoryError异常(OOM内存溢出)
(3)本地方法栈 线程私有
本地方法栈与VM栈相似,VM栈为虚拟机运行VM原语服务,而本地方法栈为虚拟机运行到Native方法服务。这个区域也会抛出StackOverflowError和OutOfMemoryError异常
(4)Java堆 线程共享
Java堆被所有线程共享,在虚拟机启动时创建。
虚拟机管理最大的一块内存,GC管理的主要区域。
Java堆的唯一目的就是存放对象实例,绝大部分的对象实例都在这里分配。Java堆可细致的分为:新生代、老年代,再细致点的:eden、from survivor、to survivor.
Java堆可以处理物理上不连续的内存空间,它逻辑上是连续的即可。
(5)方法区
也叫永久代。用于存储已被虚拟机加载的类的信息包括常量池(基本信息、字段信息、方法信息)和静态区(static变量、方法、块)。
并不是说永久代里不会发生GC,这里的GC主要是对常量池的回收和对类的卸载。
(6)运行时常量池
Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量表,用于存放编译期已可知的常量,这部分内容将在类加载后进入方法区(永久代)存放。但是Java语言并不要求常量一定只有编译期预置入Class的常量表的内容才能进入方法区常量池,运行期间也可 将新内容放入常量池(最典型的String.intern()方法)。

运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法在申请到内存时会抛出OutOfMemoryError异常





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值