JVM学习(1)-组成

java虚拟机运行时数据区主要分为程序计数器、虚拟机栈、本地方法栈、java堆、方法区。

程序计数器(PC)
1:可以看作是当前线程所执行字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
2:因线程之间需要根据时间片轮询抢夺CPU资源,所以每一个线程需要一个程序计数器,线程私有。

虚拟机栈
1:和java线程在同一时间创建,也是线程私有的。
2:虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、返回地址等信息。每一个方法从调用直至完成对应着一个栈帧从虚拟机栈入栈和出栈的过程。
3:局部变量表存放编译期可知的各种基本数据类型、对象引用和returnAddress类型(指向一条字节码指令的地址)
4:栈帧中性能调优主要关注局部变量表,其中64位长度的long和double类型占用2个局部变量空间,其余数据类型占用1个。
5:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。如果虚拟机允许动态扩展,扩展时无法申请到足够的内存,将抛出OutofMemoryError异常。

本地方法栈
1:与虚拟机栈类似,区别在于虚拟机栈用于管理java函数的调用,本地方法栈用于管理本地方法的调用。

java堆
1:java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
2:几乎所有的对象和数组都在堆中分配空间,由于现在收集器基本都采用分代收集算法,所以可细分为新生代和老年代。再细分一点有Eden、Survivor Space0(from survivor)、Survivor Space1(To Survivor)空间。大部分对象刚建立时放入Eden,至少经历过一次回收的对象有可能放入Survivor Space0、Survivor Space1。
3:java堆可以处于物理上不连续的内存空间中,只要逻辑上连续。如果在堆中没有内存完成实例分配并且堆也无法再扩展时将会抛出OutOfMemoryError异常

方法区
1:方法区也被各线程共享,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
2:在Hot spot虚拟机,方法论也叫永久区,永久区的对象也可以GC回收,通常由两个方面分析,一是对常量池的回收、一是对类元数据的回收。当方法区无法满足内存分配需求时将抛出OutofMemoryError异常

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

itunewu

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值