☆关于JAVA虚拟机必须了解的理论知识(基础理论篇)

1.概论

java虚拟机在执行java程序的过程中会把他管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁时间,有些区域伴随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束而建立和销毁,根据相关规定(《java虚拟机规范》),java虚拟机所管理的内存将会包括以下几个运行时数据区域:

2.概念介绍

  • 程序计数器:是一块比较小的内存空间可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变着计数器的值来选择下一条要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能 都需要依赖计数器完成。java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间类实现的,看似是同时进行,实际在特定的时刻,对单核处理器来讲只会执行一条线程中的指令,不同的是线程的进度记忆也是靠程序计数器来完成的,个线程的程序计数器互不影响,独立存储,这种内存区域为“线程私有”的内存。
  • Java虚拟机栈:也是私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的相同时都会创建一个栈帧用于储存局部变量表,动态链接,方法出口信息等。每一个方法从调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程
  • 本地方法栈:与虚拟机栈的作用类似,有的虚拟机如Sun HotSpot虚拟机直接把本地方法栈和虚拟机栈合二为一。
  • Java堆:对大多数应用来说,java堆是java虚拟机所管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存存在的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。java堆是垃圾收集器管理的主要区域,因此很多时候也被称为"GC堆"。由于现在收集器基本都是采用分代回收算法,所以java堆还可细分为;新生代和老年代。就java堆可以处于不连续的内存空间中。
  • 方法区:跟java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等区域。
  • 运行时常量池:他是方法区的一部分,用于存放存放编译器生成的各种字面量和符号引用,这部分的内容酱紫啊类加载后进入方法区的运行时常量池中存放。
  • 直接内存:他并不是虚拟机运行时数据区的一部分,也不是娟虚拟机规范中定义的内存区域,java4中加入了NIO类你,引入了基于通道与缓冲区的I/O方式,他可以使用Native函数库直接分配对外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。

综上,java中内存结构可总结如下:

3.HotSpot虚拟机对象探秘

3.1对象创建过程

原图有备注,原图地址:https://www.processon.com/mindmap/5dd16b89e4b0be0584f16d5b

3.2对象的内存布局

3.3对象的访问定位

 由于reference类型在Java虚拟机规范里只规定了一个指向对象的引用,并没有定义这个引用应该通过哪种方式去定位,以及访问到Java堆中的对象的具体位置,因此不同虚拟机实现的对象访问方式会有所不同,主流的访问方式有两种:使用句柄直接指针

句柄访问方式:java堆中将划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息

使用句柄方式最大的好处就是reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。

指针访问方式:reference变量中直接存储的就是对象的地址,而java堆对象一部分存储了对象实例数据,另外一部分存储了对象类型数据。

如果使用该方式,Java堆对象的布局就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象地址。使用直接指针方式最大的好处就是速度更快,他节省了一次指针定位的时间开销

HotSpot而言,他使用的是直接指针访问方式进行对象访问,但从整个软件开发的范围来看,各种语言和框架使用句柄来访问的情况也十分常见

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值