JVM--自动内存管理--JAVA内存区域

1. 运行时数据区域

  1. 灰色的线程共享,白色的线程独享

  2. 白色的独享就是根据个体"同生共死"

  3. 程序计数器:

    1. 是唯一一个没有OOM(内存溢出)的地方

    2. 是线程独享的

    3. 作用:

      1. 是一块较小的内存空间,是当前线程所执行的字节吗的行号指示器

      2. 由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器

  4. java虚拟机栈:

    1. 线程私有的,生命周期和线程相同

    2. 作用

      1. 每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

      2. 局部变量表:局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

      3. 这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中64位长度的long和double类型的数据会占用两个变量槽,其余的数据类型只占用一个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。请读者注意,这里说的“大小”是指变量槽的数量,虚拟机真正使用多大的内存空间(譬如按照1个变量槽占用32个比特、64个比特,或者更多)来实现一个变量槽,这是完全由具体的虚拟机实现自行决定的事情。(如果变量槽是64比特,long和double可能会占用1个变量槽呢)

  5. 本地方法栈:

    1. 本地方法值:非java语言编写的程序

    2. 本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

  6. 堆:

    1. 是虚拟机所管理的内存中最大的一块

    2. 物理上可以不连续,逻辑上连续就可以

    3. Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。

    4. 从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB),以提升对象分配时的效率。例如:10个人共同分配财产,谁使用谁来财务处拿,如果每次使用都来拿使用的钱,那么就会很慢,如果先给10个人 一人100,使用完来再分配100,那么会将速率提升(TLAB对象创建的一种方式,后面在对象创建会详细说)

    5. 不过无论从什么角度,无论如何划分,都不会改变Java堆中存储内容的共性,无论是哪个区域,存储的都只能是对象的实例,将Java堆细分的目的只是为了更好地回收内存,或者更快地分配内存。

  7. 方法区:

    1. 与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

  8. 运行时常量池

    1. 运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

    2. 既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError(内存不足)异常。

  9. 直接内存

    1. 并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。

    2. 例如I/O操作的内存,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。

    3. 本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制

2. HotSpot虚拟机对象探秘

1. 对象的创建:

      1.  对象是如何创建的:

                 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成 后便可完全确定,为对象分配空间的任务实际上便等同于把一块确定 大小的内存块从Java堆中划分出来。假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一 边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那 个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞Bump The Pointer)。

                产生的问题及解决方案

                    1.内存不规整

                          如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那 就没有办法简单地进行指针碰撞了

                         虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分 配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称 为“空闲列表”(Free List)

                     2.并发问题:                 

                          对象创建在虚拟机中是非常频繁的行 为,即使仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象 A分配内存,指针还没来得及修改,对象 B 又同时使用了原来的指针来分配内存的情况。
                        解决这个问题有两种可选方案
                          一种是对分配内存空间的动作进行同步处理—— 实际上虚拟机是采用 CAS 配上失败 重试的方式保证更新操作的原子性;
                            另外一种是把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java 堆中预先分配一小块内存,称为本地线程分配缓冲( Thread Local Allocation
Buffer TLAB ),哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完 了,分配新的缓存区时才需要同步锁定。

      2. 创建阶段将分配到的内存空间(但不包括对象头)都初始化为零值

      3. 从虚拟机的视角来看,一个新的对象已经产生了。但是从Java程序的视

角看来,对象创建才刚刚开始——构造函数,即Class文件中的<init>()方法还没有执行,所有的字段都

为默认的零值,对象需要的其他资源和状态信息也还没有按照预定的意图构造好。

2. 对象的内存布局(对象的组成):

  1. 分为3部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

  2. 对象头信息

    1. 第一类:下边的表对应的是存储锁标志位

    2. 第二类:

      1. 对象头的另外一部分是类型指针,即对象指向它的类型元数据的指针,Java虚拟机通过这个指针来确定该对象是哪个类的实例。

      2. 并不是所有的虚拟机实现都必须在对象数据上保留类型指针,换句话说,查找对象的元数据信息并不一定要经过对象本身

      3. 此外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。(所以由于对象头中有记录数组长度的数据所以查询长度时用的是.length而不是方法)

    3. 实例数据

      1. 是对象真正存储的有效信息,即我们在程序代码里面所定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的字段都必须记录起来。

      2. 这部分的存储顺序会受到虚拟机分配策略参数(-XX:FieldsAllocationStyle参数)和字段在Java源码中定义顺序的影响。

      3. HotSpot虚拟机默认的分配顺序为longs/doubles、ints、shorts/chars、bytes/booleans、 oops(OrdinaryObject Pointers,OOPs)

    4. 对齐填充:
      1. 这并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。

      2. HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍(任何对象的大小都必须是8字节的整数倍。),对象头部分已经被精心设计成正好是8字节的倍数(1倍或者2倍),因此,如果对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

  3. 对象的访问定位
    1. 定义:创建对象自然是为了后续使用该对象,我们的Java程序会通过栈上的reference数据来操作堆上的具体对象。

    2. 有两种主流的访问形式

      1. 使用句柄访问:Java堆中将可能会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自具体的地址信息

      2. 直接指针访问:Java堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference中存储的直接就是对象地址,如果只是访问对象本身的话,就不需要多一次间接访问的开销

         

      3. 两种的优势:

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

        2. 解释:例如在java栈的本地变量表中存有多个reference指向同一对象的,如果对象被移动(地址变化)只需要改变变句柄中的实例数据指针就可以,而reference指向的是对象实例数据的指针,所以不需要变化,而直接指针访问就需要改变每一个reference中的句柄地址

                     同样由于直接指针节省了一次指针定位的时间开销,所以使用直接指针来访问最大的好处就是速度更快      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3250372.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一些用于记录和管理文献和内容的软件

手写笔记&#xff1a; OneNote(office 旗下&#xff0c;简单好用&#xff0c;往往用了一些花哨的之后发现最开始的反而最好用) 平台&#xff1a;win和ios 手写笔记pdf Notabillty 学术笔记整理 Zotero(可以添加到chrome) 有插件可以用&#xff0c;下拉到页面 browse 个人知…

MaxSite CMS v180 文件上传漏洞(CVE-2022-25411)

前言 CVE-2022-25411 是一个影响 Maxsite CMS v180 的远程代码执行漏洞。攻击者可以通过上传一个特制的 PHP 文件来利用这个漏洞&#xff0c;从而在受影响的系统上执行任意代码。 漏洞描述 该漏洞存在于 Maxsite CMS v180 的文件上传功能中。漏洞利用主要通过允许上传带有危…

VS C#类文件自动生成头部注释

VS C#类文件自动生成头部注释&#xff08;以VS2019为例&#xff09; 1、更新位置 E:\VS2019\vs_2019\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class 2、替换Class 原始文件 using System; using System.Collections.Generic; $if$ ($targetframeworkversion$ > 3.5…

分享:一次性查找多个PDF文件,如何根据txt文本列出的文件名批量查找指定文件夹里的文件,并复制到新的文件夹,不需要写任何代码,点点鼠标批量处理一次性搞定

简介&#xff1a; 该文介绍了一个批量查找PDF文件&#xff08;不限于找PDF&#xff09;的工具&#xff0c;用于在多级文件夹中快速查找并复制特定文件。用户可以加载PDF库&#xff0c;输入文件名列表&#xff0c;设置操作参数&#xff08;如保存路径、复制或删除&#xff09;及…

抖音/快手/小红书私信卡片在线制作

W外链平台&#xff0c;作为现代网络营销领域的一颗璀璨明星&#xff0c;其强大的功能和独特的优势已经吸引了无数企业和个人的目光。在如今这个信息爆炸的时代&#xff0c;如何有效地将自己的网站、产品、服务推广出去&#xff0c;成为了每个营销人员都在思考的问题。而W外链平…

json将列表字典等转字符串,然后解析又转回来

在 Python 中使用 json 模块来方便地在数据和 JSON 格式字符串之间进行转换&#xff0c;以便进行数据的存储、传输或与其他支持 JSON 格式的系统进行交互。 JSON 字符串通过 json.loads() 函数转换为 Python 对象。 pthon对象通过json.dumps()转为字符串 import jsonstr_list…

PostgreSQL 中如何处理数据的并发读写和数据一致性的实时监控?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的并发读写和数据一致性的实时监控一、并发读写的挑战与解决方案&#xff0…

Python虚拟环境使用

在公共服务器上为了跟别人的实验环境不冲突&#xff0c;最好的办法就是一人一个环境&#xff0c;在这里就提到了Python的虚拟环境。此处借助pycharm连接服务器&#xff0c;来新建虚拟环境。 具体步骤&#xff1a; 先在pycharm里打开终端Terminal&#xff0c;连接服务器的命令…

基于java+springboot+vue实现的中小企业人事管理系统(文末源码+Lw)128

基于SpringBootVue的实现的中小企业人事管理系统&#xff08;源码数据库万字Lun文流程图ER图结构图ppt演示视频软件包&#xff09; 系统角色&#xff1a; 员工、管理员 系统功能&#xff1a; 管理员登录 进入中小企业人事管理系统可以查看首页、个人中心、员工管理、部门信息管…

Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库

什么是 Prisma? Prisma 是一个开源的下一代 ORM。它包含了以下部分&#xff1a; Prisma Client: 自动生成、类型安全的查询构建器&#xff0c;用于 Node.js 和 TypeScriptPrisma Migrate: 数据迁移系统Prisma Studio: 查询和编辑数据库中数据的图形化界面 Prisma 客户端可以…

SQL知识点合集3

一、创建视图 create view 视图名 as select * from 表名 where 条件 二、触发器 触发器是与表有关的数据库对象&#xff0c;在 insert/update/delete 之前或之后触发并执行触发器中定义的 SQL语句&#xff0c; 有三种触发器类型。 1.insert触发器2.update触发器3.delete触…

WebRTC音视频-环境搭建

目录 期望效果 1:虚拟机和系统安装 2:WebRTC客户端环境搭建 2.1&#xff1a;VScode安装 2.2&#xff1a;MobaXterm安装 3:WebRTC服务器环境搭建 3.1&#xff1a;安装openssh服务器 3.2&#xff1a;安装Node.js 3.3&#xff1a;coturn穿透和转发服务器 3.3.1&a…

数据容易泄露,有什么软件可以加密吗

1. 金刚钻信息网站 特点&#xff1a;以其独特的透明加密技术和强大的权限管控功能著称&#xff0c;支持多种加密算法&#xff08;如AES、RSA&#xff09;&#xff0c;提供详细的审计日志&#xff0c;记录所有加密文件的访问、修改和删除操作。适用于企业用户&#xff0c;可以有…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项&#xff1a;退出要输入“6”退出才能保存数据&#xff0c;不要直接按X关掉窗口&#xff08;不会保存数据&#xff09;。 效果图 源代码 编…

七款好用的CAD图纸加密软件推荐|2024最新排行榜

在2024年的今天&#xff0c;随着数字化转型的深化&#xff0c;企业对保护知识产权和商业机密的需求愈发迫切。特别是在依赖计算机辅助设计&#xff08;CAD&#xff09;的行业中&#xff0c;图纸加密软件成为了关键的工具&#xff0c;用于维护设计图纸的安全。以下是根据市场反馈…

<数据集>蛋壳裂缝检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2520张 标注数量(xml文件个数)&#xff1a;2520 标注数量(txt文件个数)&#xff1a;2520 标注类别数&#xff1a;2 标注类别名称&#xff1a;[crack, egg] 序号类别名称图片数框数1crack245128352egg25142514 使…

RHCSA —— 第七节 (文件、 目录)

FHS FHS --- filesystem hirearchy standard 文件系统层级标准&#xff0c;定义了在类Unix系统中的目录结构和目录内容&#xff0c;即用户知道已安装的软件放在哪个目录下 Linux 目录结构的特点 1.使用树形目录结构来组织和管理结构 2.整个系统只有一个根目录&#xff08;…

卸载linux 磁盘的内容,磁盘占满

Linux清理磁盘 https://www.cnblogs.com/siyunianhua/p/17981758 当前文件夹下&#xff0c;数量 ls -l | grep "^-" | wc -l ls -lR | grep "^-" | wc -l 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找…

记录vivado自带IP iBert眼图近端回环

记录利用vivado自带IP核工具测试信号质量 ibert是测试眼图的工具&#xff0c;在使用的时候并不用改太多的内容&#xff0c;只需要注意参考时钟及所需要的引脚即可。由于条件的限制&#xff0c;并没有使用光纤和电缆进行连接进行外部回环&#xff0c;仅使用内部回环做测试&…

P4-AI产品经理-九五小庞

从0开始做AI产品的完整工作方法 项目启动 项目实施 样本测试模型推荐引擎 构建DMP&#xff08;数据管理平台&#xff09; 项目上线