jvm学习笔记(一)-- java内存区域

运行时数据区域

运行时数据区

一、程序计数器(记录程序运行的位置)
  • 程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器
  • 字节码解释器工作室就是通过改变计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成
  • java多线程是通过时间切片来分配线程执行的,当一个线程的时间片耗尽时,就需要有一个记录线程的运行记录,方便下一次轮转到此线程执行时可以从上一次挂起的位置继续执行,因此,每一个线程都需要有一个计数器,且线程中计数器是线程隔离的,互不影响,为线程私有
  • 执行Java方法时,计数器记录的是正在执行的字节码指令的地址,执行native方法时,计数器为空。
二、java虚拟机栈

虚拟机栈

  1. Java虚拟机栈
    • 是线程私有的,生命周期于线程相同。虚拟机栈描述的时java方法执行的内存模型,每个方法在执行的同时都会同时都会创建一个栈帧(Stack Frame)用于储存局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的调用到完成就相当于一个栈帧在虚拟机中入栈到出栈的过程
  2. 局部变量表
    • 存放编译期可知的各种基本数据类型、对象引用(对象引用指针或对象句柄)、returnAddress类型(指向了一条字节码指令的地址)
    • long和double类型的数据会占据两个局部变量空间(Slot),其余的数据类型都只占用一个,局部变量表所虚空见在编译期间完分配,当进入一个方法时,这个方法在帧中需要分配的局部变量空间是确定的,方法运行期间不会改变
  3. 会抛异常:StackOverflowError和OutOfMemoryError
三、本地方法栈(Native Method Stack)
  1. 为虚拟机使用到的Native方法服务,虚拟机规范中对本地方法栈中方法使用的语言、使用方式、与数据结构没有强制规定。
  2. 有的虚拟机(如hotspot)直接将本地方法栈于虚拟机栈合二为一
  3. 会抛异常:StackOverflowError和OutOfMemoryError
四、java堆(Java Heap)
  1. java堆是java虚拟机所管理的内存中最大的一块,所有线程共享,在虚拟机启动时创建
  2. java堆的唯一作用就是存放对象实例
  3. java堆是垃圾收集器管理的主要区域
五、方法区(Non-Heap)
  1. 线程共享的区域,储存已被虚拟机加载的类信息【全限定类(包名.类名)、直接父类。全限定类名、直接接口的有序列表、修饰符】、常量、静态变量、即时编译器编译后的代码等数据
  2. 运行时常量池
    • 存放编译器生成的各种字面量和符号引用,在类加载后进入方法区运行时常量池存放
六、直接内存

对象

一、创建对象时的内存分配
内存分配
  1. 指针碰撞

    绝对规整的堆内存,已使用的内存与未使用的内存通过一个指针分隔开,两种内存不交叉,分配仅将指针移动与对象大小相等的距离即可

在这里插入图片描述

  1. 空闲列表

    内存不规整,已使用与未使用内存相互交叉,使用一个链表记录未使用的内存空间,分配对象内存时从链表中寻找一块足够大的内存进行划分

内存分配-空闲列表

二、对象的内存布局(HotSpot)
1. 对象头
  1. 储存对象自身的运行时数据(Mark Word),如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等
  2. 类型指针,即对象指向它的类元数据的指针,虚拟机由此确定该对象属于哪个类
2. 实例数据
  • 对象真正储存的有效信息
3. 对齐填充
  • 使整个对象所占内存为8字节的整数倍,当占位符使用
三、访问定位
1. 句柄访问(稳定)

java堆中将划分一块内存作为句柄池,对象引用储存对象句柄地址,句柄中包含对象实例数据以及类型数据各自的具体地址信息

句柄访问

2. 直接指针访问(hotspot使用,定位速度快)

引用类型存放Java堆对象地址,堆对象需考虑如何放置对象类型数据

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值