(一)Java虚拟机基础详解

第一序:Java虚拟机的概况




程序计数器:作为当前线程执行java字节码的行号指示器!控制执行的哪行字节码,例如:循环,条件,顺序执行时的字节码位置!程序计数器区域是线程私有,多线程都有自己的程序计数器,相互独立,互补干扰,保证程序有条不紊的执行!

 

java虚拟机栈:这是一个与java方法密切相关的内存区域,也是属于线程私有,与线程的声明周期一样。这块内存区域描述的是java方法执行的内存模型:每个方法执行的同时就在这块区域中创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口信息。一个方法的生命周期对应栈帧的入栈和出栈过程。

 

本地方法栈:与虚拟机栈类试,本地方法栈是为本地方法服务的!

 

Java堆:堆可以说是java内存管理区域中最大的一块区域,也是非常重要的一块区域,属于线程共享区域。主要负责存放创建的对象,垃圾收集器gc主要负责这一块区域。现在的garbgecollectionheap主要采用分代算法进行回收,所以又将这块区域分为:新生代和老年代;甚至还有更细致的划分!在物理设备可以要求不连续,逻辑上连续便可以,而且也是可扩展的,参数-xms-xmx进行配置!

 

方法区:与堆相似,是线程共享区域。主要存放被虚拟机加载的类信息,静态变量,常量,即使编译器编译的代码等数据。java虚拟机规范将其做为堆得逻辑一部分,但是却区分堆而称作Non-Heap;

运行时的常量池:常量池作为方法区的一部分,用于存放编译器生成的各种字面常量和符号引用,这些数据在类加载的时候被存入常量池中。




第二序:探索虚拟机管理对象机制



对象的创建:先检查常量池中是否有一个类的符号引用,然后检查这个符号引用代表的类是否已经被检查,解析和初始化过。然后虚拟机在java堆区划分出该类所需要大小的内存空间,其中有两种方式:指针碰撞,空闲列表。

最后再对内存空间初始化为零值。

 

对象的内存布局:对象在内存中的布局可以分为三部分:对象头,实例数据,对齐填充。

对象头:包括两部分:其一,对象运行时的被标记的数据。其二,对象的类型指针。
被标记数据包括:哈希码,GC年代分龄,锁状态标志,线程持有锁等

实例数据:类自身定义的数据结构,类的特征

对齐填充:对其填充并不是一定要存在,仅是占位作用。由于HotSpot的规范要求对象起始地址需要时8字节的整数倍开始,意思是说:对象 大小必须8字节整数倍,对象头已经满足,然而对象的示例数据不满足时就需要对其填充。

 

对象的定位访问:有两种方式,都是指针引用的方式访问。其一:句柄访问;其二:直接指针访问。区别在于,句柄是唯一标识对象既包含该对象的示例数据又包括对象类型,而直接指针只是指向对象的示例数据。其中句柄的引用或者对象的直接引用都是放在虚拟机栈区。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值