关于jvm的个人整理

Jvm是Java程序员永远绕不开的一个话题,今天聊下jvm,jvm主要的构成部分主要有以下的几部分:
1.方法栈:该部分是线程独享的,每一个方法在其中就是一个栈帧当执行方法时候方法就会压入其中,称为压栈执行,在每个栈帧中维护了一个局部变量表用来存用用到的基本数据类型和对象的引用。
2.程序计数器(PC寄存器):它记录了程序执行的位置,他也是线程独享的,在采取时间片轮询的时候它记录了线程挂起的位置。
3.本地方法栈:顾名思义就是java的本地方法执行的地方,他是由C++或者C语言来编写的,他的结构是和方法栈非常相似的,甚至在有的虚拟机中是不对两者进行区分的(比如sun公司的HotSPot)。
4.堆:jvm所管理的最大的空间,与堆相关的一个概念就是垃圾收集器,基于垃圾收集器的分代收集的算法,堆区分为了新生代和老年代,在新生代有分为了eden区和form servivor以及To servivor区,他们三者是8:1:1的关系。
5.方法区:其中主要就是存储一些元数据信息,比如我们创建的对象就会放入其中,还有一些常量。有的地方喜欢把它称之为持久代,但是这样的说法是不够准确的,这两者是有区别的,可以说方法区是包含持久代的,持久代就是会放置一些存活时间比较长的数据,在jdk1.8以后就取消了永久代的概念,取而代之的是元数据空间。需要注意的是永久代当类进行卸载的时候也是会发生垃圾回收的。
6.直接内存:DIrect Memory,他是不受jjvm管理的一块区域,他与java的Nio密切相关,jvm通过堆上的DirectByteBuffer来操作直接内存的。这块内存是不会被垃圾回收器回收的。
7.运行时常量池:他是属于方法区的一部分主要用来存储一些常量。
以上就是jvn的七个主要部分的简单介绍。

其中有些细节需要进行细化,比如栈中的引用是如何指向堆上的实际对象的,这可以称之为定位,一个真实的对象其实是分为两部分的,一部分是其真实数据,另外一部分是其类型数据,其真实的数据是存储在堆上的但是类型数据属于元数据的信息 ,所以这些类型数据是存储在方法区上的,在java堆中还必须包括能查找到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息。

有两种基本的定位方式:
1.句柄访问(间接):在Java堆中划分一块内存作为句柄池(即一个句柄列表),reference中存储的就是对象在句柄池中的地址,得到了句柄池的地址就可以知道对象的实例数据和类型数据的位置。
2.直接指针访问(直接):reference中存储的直接就是对象的实例数据的地址,而实例数据中自己有一个指针存储对象类型数据的地址(方法区中),不需要reference来存储。

直接指针访问的定位方式是比句柄访问效率要稍微高一点的,因为在垃圾收集器收集完成以后可能会对内存进行整理,此时可能涉及数据的移动,如果采取直接指针访问的形式此时引用只移动一次即可指向新的数据地址,但是对于句柄访问可能要移动两次。所以HotSpot采用了这种定位方式。

一个对象在进行创建的时候主要分为了三个步骤,他们分别是:
1.在堆上创建出对象的实例。
2.为对象的实例变量(注意区分静态变量)赋初始值。
3.将引用返回。

在创建对象的实例的时候由于垃圾收集器的作用此时会采用两种创建对象的方式,他们分别是指针碰撞和空闲列表。因为垃圾收集器会对空闲空间进行移动这是就会产生连续空间,但是如果使用标记清除算法此时可能不会产生连续的内存空间,基于连续的内存空间和不连续的内存空间就分别对应了指针碰撞和空闲列表。
1.指针碰撞:堆中的内存通过一个指针进行分割,一侧是已经被占用的另外一侧是没有被占用的,当创建对象使用未被占用的内存空间时候就会发生指针的移动,这就叫指针碰撞。、
2.空闲列表:堆中的空闲内存和被占用内存是交织在一起的,这是虚拟机就会通过一个列表来记录哪些空间是可以被使用的哪些空间是已经被使用的,接下来找出可以容纳新创建对象的且违背使用的内存空间,在此空间存放该对象,并且修改空闲列表的值。

一个对象在内存中的布局:
1 . 对象头(Header):对象头包含两个部分的信息,第一部分是对象自身的运行时数据,如哈希码、GC分代年龄、持有的锁等等;第二部分是类型指针,指向它的类元数据的指针,通过这个虚拟机来确定这个对象是哪个类的实例。
2. 实例数据(Instance Data):对象真正存储的数据,就是程序代码中定义的字段内容。
3. 对齐填充(Padding):用于使对象的开头必须是8字节的整数倍,无特殊意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值