Java虚拟机第二章2.2 学习笔记

Java运行时数据区
1、程序计数器:是一小块内存空间,是当前线程所执行的字节码的行号指示器(每个线程都有一个)。因为Java多线程中,线程轮流切换并分配处理器执行时间,实际上一个处理器在一个时间点只能执行一条指令。所以当线程切换时,为了使程序能继续恢复到正确的执行位置,就需要程序计数器告诉我们当前程序执行到哪里了。
2、Java虚拟机栈
是Java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成都伴随着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表:存放了编译期可知的各种基本数据类型(8种)、对象引用和returnAddress(一条字节码指令的地址),该表在编译期已经确定了大小,方法运行期不会改变局部变量表的大小。
如果线程请求的栈深度大于虚拟机上限,则StackOverFlow异常, 如果请求栈无法申请到足够内存,则报OutOfMemoryError。
3、本地方法栈
和虚拟机栈作用类似,虚拟机栈为执行的Java方法服务, 本地方法栈为虚拟机使用到的native方法服务。
4、Java堆
是所有线程共享的一块区域,唯一目的是存储对象实例。几乎所有对象实例都在此分配内存。粗略包括新生代、老年代,细分为:Eden、From Survivor,To Survivor。可在物理上处于不连续的空间中,可扩展。
5、方法区
各个线程共享的内存区域。用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
-XX:PermSize、-XX:MaxPermSize
分配用来设置方法区的最小大小和最大大小。Java 8以后移除了方法区,取而代之的是本地元空间Metaspace,大小由-XX:MetaspaceSize和-XX:MaxMetaspaceSize调节。
5.1运行时常量池
是方法区的一部分。class文件中除了类版本、字段,方法,接口等描述信息外,还有这个‘常量池’,存储编译期生成的‘字面量’和‘符号引用’,这两个东西将在类加载后存储在‘常量池’中。一般‘直接引用’也会存储于‘常量池’中。
6、直接内存
使用native函数库分配堆外内存

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值