深入理解JVM(八):内存管理

运行时数据区

在这里插入图片描述

1.程序计数器

​ 记录当前线程的执行行数

2.虚拟机栈(stack)

栈:单向队列,后进先出

​ 线程私有,生命周期与线程一致,描述的是java方法执行的内存模型,每个方法在执行时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态连接,方法出口等信息,每一个方法从调用到执行结束,就对应这一个栈帧从虚拟机栈中入栈 到出栈的过程

​ 在编译程序代码时,栈帧需要多大的局部变量表,多深的操作数栈都已经完全确定,因此一个栈帧需要分配多少内存,不会受程序运行时期变量数据的影响.

​ 一个线程中的方法调用链可能会很长,很多方法都处于同时执行的状态,对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,执行引擎运行的所有字节码指令都只针对当前栈帧来操作的.

局部变量表:

​ 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量

3.本地方法栈

​ 虚拟机使用的native方法,线程私有

4.堆(heap)

​ JVM所管理的内存中最大的一块,线程共享,主要用于存放对象实例和数组,内部可以设置出多个线程私有的分配缓冲区.可以位于物理上不连续空间

​ 新生代和老年代 1:2
在这里插入图片描述

指针碰撞: 前提是堆中的空间通过一个指针进行分割,一侧是已经被占用的空间,另一侧是未被占用的空间

空闲列表: 前提是堆内存空间中已被使用与未被使用的空间是交织在一起的,这时虚拟机就需要通过一个列表来记录哪些空间是可以使用的,哪些空间是已被使用的,接下来找出可以容纳下新创建对象的且未被使用的空间,再次空间存放该对象,同时还要修改空闲列表上的记录

5.方法区

​ 线程共享内存区域,存储已被虚拟机加载的类的信息,常量,静态变量,即使编译器编译后的代码等数据.

​ 对于习惯于在hotspot虚拟机上开发和部署的开发者来说,很多人愿意把方法区称为永久代(

java8之前,使用永久代来实现方法区,在java8之后,废除永久代,将字符串常量池移到堆中,并新增了metaspace直接在系统内存中),本质上两者并不等价,仅仅因为hotspot虚拟机的设计团队把GC分带收集扩展至方法区,或者说使用永久代来实现方法区而已.

6.运行时常量池

​ 属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用.内存有限可以抛出内存溢出异常

7.直接内存

​ Direct Memory,与java NIO密切相关,JVM通过堆上的DirectByteBuffer来直接操作内存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值