JVM学习(一):java的内存结构

JVM学习(一):java的内存结构

1.JVM java的内存结构

  • 运行时数据区

  • 由上图我们可以看出,java内存结构一般由五部分组成
    1. 堆:Java堆屎JVM所管理的内存当中,最大的一块,它是被所有线程共享的一块内存区域,在JVM启动时被创建,唯一作用就是用于存放对象实例,堆也可以分成两部分:新生代、老年代
      • 新生代:顾名思义,新创建的对象主要分配在新生代,而新生代又可以分为Eden区、s0区、s1区
      • 老年代:大对象直接存到老年代,何谓大对象,也就是需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串和数组
    2. 方法区:也是所以线程共享的一块内存区域,它用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码,也被称为“永久代”,因为这部分区域不会被GC回收
      • 运行常量池:是方法区的一部分,Class文件有一项信息是常量池,用于存放编译期生成的各种字符量和符号引用,这部分内容在类加载后进入方法区的运行常量池中存放。
      • 另外,需要注意的是:运行常量池相对于Class文件常量池的另外一个重要特征是具备动态性,也就是说,在运行期间也可以将新的常量放入池中,这部分特征被开发人员用的最多的就是String的intern方法
    3. Java栈:线程私有,每个线程都有一个Java栈。它用于描述Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧—用于存储局部变量表、操作数栈、动态链接、方法接口等信息。每个方法从调用直到执行完成的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程
    4. 本地方法栈:它与Java栈所发挥的作用是十分相似的,区别就在于:Java栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机执行Native(本地)方法服务
    5. 程序计数器:是一块较小的内存,它被看作是当前线程所执行的字节码的行号指示器,也是线程私有的

2.JVM中的对象

在HotSpot虚拟机中(jvm实现的最常用版本),对象在内存区域存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对其填充(Padding)

  1. 对象头包括两部分信息:
    • 第一部分用于存储对象本身的运行时数据,例如:哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等。
    • 另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。另外,如果对象是java数组,那么对象头中还必须有一块用于记录数组长度的数据。
  2. 实例数据:对象真正存储有效的信息,也就是代码中所定义的各种类型的字段内容
  3. 对齐填充:这部分不是必需的,也没有特别的含义,仅仅起着占位符的作用

3.JVM中的对象的访问定位

建立对象就是为了使用对象,JVM需要通过栈上的reference(引用)数据来操作堆上的具体对象,由于reference类型在JVM规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位、访问堆中的对象的具体位置,所以对象的访问取决于虚拟机的实现。目前主流访问方式有两种:句柄和直接指针。

4.推荐

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值