Java虚拟机基础

1.知识要点

1.1 JVM运行时数据区中那些区域是[线程共享]的?功能分别是什么?

线程共享:所有线程都能访问这块内存数据,该内存数据在虚拟机启动时创建,并随GC的执行而销毁。

线程共享区包含:方法区、堆内存;

方法区: 存储加载的类、常量、静态变量以及编译后的代码等数据;在虚拟机规范中,这是一个逻辑划分,具体实现因不同的虚拟机而异。例如,oracle的HotSpot在Java7中,方法区放在永久代中,而在java8中,是放在元数据空间,并通过GC机制对这个区域进行管理;

堆内存: 还可以细分为:老年代、新生代;新生代还可以再细分为:Eden,S0、S1等;垃圾回收器(GC)主要是管理堆内存,如果满了,那么将会出现OutOfMemroyError异常;

1.2 JVM运行时数据区中那些区域是[线程独占]的?功能分别是什么?

线程独占: 每一个线程都有它独立的空间,随着线程生命周期而创建和销毁;
线程独占区包含: 虚拟机栈、本地方法栈、程序计数器;

虚拟机栈: 每一个线程在这个区域拥有属于自己的私人空间,且每一个线程由多个栈帧(Stack Frame)组成。线程在该区域执行一个或多个方法,一个方法对应一个栈帧,栈帧内容包括:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等;栈内存默认最大为1M,超出则抛出StackOverflowError异常;

本地方法栈: 和虚拟机栈功能类似,虚拟机栈是为虚拟机执行Java方法而准备的,本地方法栈则是为虚拟机使用Native本地方法而准备的;虚拟机规范没有规定具体的实现,由不同的虚拟机厂商各自实现,HotSpot虚拟机中虚拟机栈与本地方法栈的实现是一样的,同样,超出则抛出StackOverflowError异常;

程序计数器: 记录当前线程执行字节码的位置,存储的是字节码的执令地址,如果执行的是Native方法,则计数器的值为空;每一个线程在该区域都有自己私有的空间,且占用的内存空间很少;CPU同一时间只会执行一条线程中的执令,JVM中的多线程是以轮流切换并分配CPU执行时间的方式实现的,当线程切换后,需要通过程序计数器中记录的当前线程在虚拟机栈中字节码执行的位置来完成继续执行操作;

2.理论解析

3.实践

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值