JVM学习笔记-02-JVM的分区及其创建对象的过程

一.JVM分区

JVM其实按我理解应该这样写 J’VM,其实它就是运行java程序的虚拟机,虚拟机说白了就相当于我们平时用的各种操作系统,windows,linux,等等.他的分区是和系统分区大体原则上是一致的.(2017年8月9日10:23:22)

JVM的运行时 分区情况 如图:

当初刚接触java的时候就了解过,堆,栈,方法区的概念,其实这是JVM的数据存储模型.

1.程序计数器

程序计数器是一个很小的内存空间,说他的主要作用类似于书签,因为计算机其实是有时间片的概念,在计算机运行时会有很多的进程,一个进程中包含了若干个线程,内核在一个特定的时间段只能处理一个进程(线程)那么其他的线程只能先等待,打个比方,把内核比作一个服务员,进程比作消费者,这个服务员是不停的游走在每一个消费者之间,他所服务的消费者分配的时间是一样的,并且循环服务的顺序也是一样的,但是他不会一次就完成一个消费者想要达到的目的,他是每一次给一个人服务时都会往前推进一些,当然这个服务员中这个速度是相当的快的,快到以消费者(人类)的感知感受不到,就好像每个人都有一个自己的专属的服务员一样,服务在逐步的向前推进.

而JVM其实就是运行在计算机系统中的一个进程而已,而程序计数器起到的作用就是记录当线程在切换的过程中当前线程进行到的位置.

2.虚拟机栈

虚拟机栈其实是线程私有的,他的生命周期和线程相同,每一个方法在执行同时都会创建一个栈帧用于保存局部变量表,操作数栈,动态链接,方法出口等信息,,一个方法的开始执行到执行完成,对应的是它栈帧创建,和出栈的过程,它内部包含了java的八个基本类型,还有程序中自定义类型的引用的堆地址(十六进制数字).

3.本地方法栈

它和虚拟机栈是类似的,主要是操作系统给提供的native方法的栈,这些方法其实就是java调用的本地方法.(native方法可以参见JDK中的object类).

4.堆

堆是被所有的线程所共享的区域,对于多数的应用来说Java堆是JVM管理的最大的一块内存,它是在jvm运行时创建的原则上将,每一个对象在堆中都是有迹可循的,堆也是GC工作的主要区域.

5.方法区

和堆一样,方法区是被所有线程所共享的区域,它用于存储被虚拟机加载的类信息,常量,静态变量,及时编译器编译后的数据.虽然java虚拟机规范中把方法区描述成堆的一个逻辑部分,但是他还有一个别名(Non-Heap)’非堆’.

在hotspot中做了GC的延伸,可以做到对方法区的回收,当然大部分的JVM是没有对方法区做’垃圾回收’.并且大部分的GC想去处理方法区的时效率都是不能让人满意的,方法区相当于堆中的永久层一样,’永久’.当然方法区的GC回收有时候会必须的,在一些较早版本的hotspot中出现过严重的BUG导致方法区的溢出.

二.创建对象过程(实例化过程)

1.创建对象前的准备

虚拟机在发现一个new 指令以后,先去查找这个类的引用,看这个类是否已经被加载,解析,初始化过了,如果没有首先进行类加载.

2.堆内存的分配

类经过来加载器的加载之后它的大小就已知了,这时堆开始给他做堆内存的分配,使用的方式是’指针碰撞’.

3.对象’参数’的设置

当内存开辟完成后,会给对象赋予’0’值,并且会赋予对象的对象头一些初始的参数,如:对象是哪一个对象的实例,哈希码,对象的GC年龄分代,当虚拟机开始运行的时候,他的偏向锁问题,线程信息.

当以上的步骤走完之后,对象算是实例化完成,这时开始初始化,即给对象赋于想要的值这时才能说这个对象创建完毕.

三.对象的内存布局

对象的内存布局模型分为三个部分:

1.对象头:

对象头主要是存放一些对象创建时候的参数,就像上面提到的哈希码,GC年龄分代,实例类型等.当JVM开始运行时还有一些运行的信息,根据具体运行情况的线程信息(线程Id),偏向锁等等…这些信息是比较多的,但是当程序运行时会有大量的对象被创建,这时尽量将对象头占有的空间压缩,以便更小的空间存储更多的信息是必要的.

2.另一部分

另一部分是对象指向他的类元数据的指针,虚拟机通过这个来确定这个类的实例.

四.类的访问机制

JVM是如何抓取类的呢? 两种机制

1.句柄访问

运行时先从Java栈中取到引用,再到堆中获取到对象实例的指针获取对象实例数据,去方法区获取对象类型数据.

2.直接指针访问

直接将对象实例数据和对象类型数据放在java堆中,这种获取方式比句柄访问少了一次访问,当对象较多时这种访问方式可以节约客观的时间成本,当前 hotspot就是使用直接指针访问的方式.
(2017年8月11日09:36:26)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值