JVM学习(一):各个部分的介绍与认识

从内存可分为:堆,虚拟机栈,程序计数器,本地方法栈,方法区五个部分

1)程序计数器

占用内存空间很小,属于线程私有,实现程序的分支,循环,跳转,线程恢复等基本功能,帮助多线程工作室,切换线程后,恢复到正确的执行位置。每个线程运行的时候都会有独立的计数器,是唯一一个没有OOM情况的区域

2)虚拟机栈

属于线程私有,生命周期和线程一致,存储的是一个个栈帧,每个栈帧对应的是一个被调用的方法。方法调用时,该方法所需内存空间在栈中进行分配,成为压栈,执行结束后,该方法所属的内存空间进行释放,成为弹栈(FIFO),
存储内容:局部变量,引用,操作数栈,动态链接,方法的出口
异常情况:StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。
OutOfMemoryError:如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。

3)本地方法栈

与虚拟房发展的作用和原理类似,区别是虚拟机栈是为虚拟机执行的java方法服务,本地房发展是为虚拟机使用的native方法服务

4)堆

属于线程共享的区域,在虚拟机创建时启动,FILO,唯一的目的是存放对象实例,几乎所有的对象实例都储存在其中
存储信息:对象实例和数组,执行时new创建的java对象,实例变量(是辣鸡回收机制的主要管理的区域)
JDK8以后:静态变量,常量池也并入堆中
异常情况:OOM 如果堆中没有内存完成实例分配,并且堆也无法再扩展时,抛出该异常。

5)方法区(1.8版本以前)

在jvm启动是被创建,存在于jvm中,物理内存空间跟堆区一样不是连续的,物理位置上是堆的一部分。属于线程共享区域,有一个非常重要的部分就是运行时常量池,这是每一个类或者接口的常量池运行时的表示形式,在类和接口被加载到jvm后,对应的运行时常量池就被创建出来。通过设置永久代初始分配空间,当jvm加载超过这个值,会报异常OOM
存储信息:类信息(名称,方法,字段等),静态变量,常量以及编译后的代码片段
永久代是jkd7以前,hotSpot虚拟机对方法区的一个落地实现

6)元空间(1.8版本以后)

跟方法区类似,但是是基于本地内存之中,元数据区大小可以使用参数-XX:MetaspaceSize和-XX:MaxMetaspaceSize指定
存储信息:类的元数据
也会发生OOM根据线程区分类

版本方法区元空间
JDK7堆内容类的元数据,静态变量,常量池-----
JDK8堆变量,静态变量,常量池-----类的元数据

ps:我理解的是方法区与元空间本质一样,都是对永久代的实现方式,只是jdk7是在jvm中进行的一个实现,jdk8是基于本地内存中的一个实现

若存在什么偏差,欢迎斧正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值