JVM-内存划分

JVM运行时数据区

这里写图片描述

JVM虚拟机栈

【概念】

  • 就是我们常说的堆栈的栈(常常把内存粗略的分为堆和栈) 线程私有,生命周期与线程一样

【作用】

  • 存放基本数据类型变量和对象的引用(局部变量表)

【特点】

  • 每个方法执行时产生一个栈帧,方法的执行就是栈针在JVM中出栈入栈的过程
  • 内存的分配和释放速度快
  • JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,不灵活
  • 栈的大小所需内存在编译时期完成分配,方法运行时期不改变局部变量表大小,四个字节占用一个局部变量空间
  • 栈的大小决定了方法调用的可达深度(递归多少层次,或嵌套调用多少层其他方法,-Xss参数可以设置虚拟机栈大小)

JVM堆

【概念】

  • 对象实例及数组存储位置(优化重点,垃圾回收重点),线程共享

【作用】

  • 存储对象和数据共线程共享

【特点】

  • Java堆可以处于物理上不连续的内存空间中,只要逻辑连续即可
  • 在虚拟机启动时创建,可通过-Xmx和-Xms控制大小
  • 分为新生代和老年代

方法区

【概念】

  • 与堆的作用一样,数据线程共享,存储的内容在永久带中

【作用】

  • 存储类JVM已加载的Class元数据包括类和接口的全限定名,字段,方法的名称和描述
  • 存储常量、静态变量: (基本类型如int,Integer,long等,无小数布尔),(对象类型如String,数组等)

【特点】

  • 常量池:常量池数据编译期被确定,并且在持久带,线程共享,是Class文件中的一部分。存储了类、方法、接口等中的常量,当然也包括字符串常量。
  • 字符串常量池:是常量池中的一部分,存储编译期类中产生的字符串类型数据。(JDK1.7开始已经移动至堆中)
  • 运行时常量池:方法区的一部分,所有线程共享。虚拟机加载Class后把常量池中的数据放入到运行时常量池。

本地方法区

【概念】

  • 和虚拟机栈功能相似,但管理的不是JAVA方法,是本地方法,本地方法是用C实现的

【作用】

  • Object中有众多Native方法,如hashCode()、wait()等

程序计数器

【概念】

  • 记录线程下一个要执行的指令

【作用】

  • 当多线程线程数超过CPU或CPU内核数时,线程间就要轮询抢夺CPU资源。因此每个线程有要有一个独立的程序计数器
  • 如果执行的是JAVA方法,计数器记录正在执行的.class文件字节码行号,如果执行的是native方法,则计数器为空
  • 内存占用比较小,划分在CPU上,程序无法直接操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值