快速理解 JVM 内存模型 对象组成 对象内存分配

news2024/10/6 13:26:05

快速理解 JVM 内存模型 & 对象组成 & 对象内存分配

JVM 内存模型

JVM 内存模型分为首先在线程纬度可以分为两部分

一部分是 线程共享: 堆、元空间

  • 堆 : 大多数 new 的对象都存在于堆内,也是 GC 主要回收的空间,占据 JVM 内存的大部分
  • 元空间:存储静态信息,如 常量、静态变量、类元信息(你写的类解析出来的字节码数据),该部分内存空间是直接内存空间。在 cpu 执行权限上,内存分为 用户空间内核空间,对于 JVM 角度来说即 JVM 堆内存区域系统直接内存区域 感兴趣可以浏览文章 零拷贝

一部分是 线程独有: 线程栈、本地方法栈、程序计数器

  • 线程栈: 细分栈帧,线程在执行方法的过程中,每调用一个方法即为该方法分配一块栈帧内存空间,方法调用结束则弹出该栈帧释放栈帧内存空间,每个线程栈空间有限,当你出现循环调用,不停的往线程栈中压入栈帧时,最终就会触发 StackOverFlow 异常。可通过 -Xss 参数配置 (线程栈使用的也是非堆内存,即直接内存)
  • 程序计数器:记录当前线程方法执行位置,用于在线程切换后恢复现场继续执行。
  • 本地方法栈:java 调用本地方法(其他语言的方法,如 C 语言方法)单独区分的栈空间,原理类似于线程栈,有些虚拟机会将其和 线程栈合成一个使用。

在这里插入图片描述

对象组成

在 Java 当中对象在存储时会分为五个部分

  1. Mark Word:属于对象的固有属性,占用 8 byte (字节 ps 1 byte = 8 bit 位)
  2. Klass Pointer 对象指针, 占用 4 byte (开启指针压缩后,Java 1.6 版本后默认开启)。
  3. 数组长度,只有数组对象有,记录数组长度 占用 4 byte。
  4. 实例数据: 这个是我们在定义类时的内部成员变量的占用,是我们开发时经常操作看的到的。
  5. 对其填充: 有时有,会将对象大小补齐为 8 byte 的倍数。

所以,对于一个对象,即使你啥都没有声明,new 出来都至少要占用 8(mark word)+4(klass pointer)+4(对其填充) = 16 byte

说说指针压缩

首先 CPU 分为 32 位寻址 和 64 位寻址,32 位的 CPU 只能处理 32 位故而只能在 2^32 = 4G 内存中寻址,所以 32 位机器和系统只能支持 4G 的内存,现在大部分机器都是 64 位即 2^64 = 18446744073709551616 可支持的理论内存是绝对够人类使用了。

那在 64 位系统下,理论上 JVM 表示一个对象所在内存的地址需要 64 位来表示即 8 byte 字节,那其实大可不必🙅🏻‍♀️

8G 寻址 = 2^33 ,16G 寻址 = 2^34 ,32G 寻址 = 2^35 ,而我们大部分机器基本都在 32G 或之内,所以基本 35 位就可以表示所有内存位置了,JVM 通过算法讲其压缩到 32 位,在到 CPU 寄存器处理时在逆向解压缩出来。指针压缩就是这个道理。

Tips:默认配置下,如果堆内存大于 32G 指针压缩会失效,一般我们最大设置堆内存会设置的比 32G 小一点点,这样可以避免很多麻烦,所以堆并不是越大越好。

指针压缩和类型的对其填充有关,默认对其填充 8 byte 倍数,调高该值可以使指针压缩支持到更大。参考 为什么JVM开启指针压缩后支持的最大堆内存是32G?

对象内存分配

在给对象分配内存的时候,有两种方式

  1. 指针碰撞: 这个是默认的方式,用于规整的 JVM 内存空间进行内存分配 (比如垃圾回收算法使用的是标记整理),这种依次分配的效率是比较高的
  2. 空闲列表:当内存并不规整,而是分散使用时,就需要维护一个空闲位置的列表地址进行分配 (标记清除)

那在分配内存的时候,多线程情况下不可避免会出现抢占问题,解决方案:

  1. 线程本地缓冲 TLAB Thread Local Allocate Buffer: 即预先给每个线程分配一块空间,有些在自己分配的空间中进行分配避免争抢
  2. 比较交换 CAS Compare And Swap + 失败重试:即多个线程争抢一个位置时,先拿到的先分配,其他的失败后重试其他位置分配

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

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

相关文章

涨薪跳槽利器,清华大咖总结的 Java 核心突击讲,一应俱全

前言 今天在这里分享一位读者粉丝的经历: 本人双非本科,没拿什么过奖,现在毕业也有三年时间了,大四感觉能力有点不足,进了一家小型的互联网公司实习;期间报名了个线上培训课程,一直在持续学习…

超详细Docker部署SpringBoot+Vue项目(三更博客项目部署)

文章目录1.项目部署规划2.前置工作2.1修改后端配置文件ip2.2修改前端Vue项目运行端口2.3修改前端对应的服务器ip2.4后端项目打包2.4.1解决打包问题2.4.2项目打包,本地运行jar包测试2.5前端项目打包2.6开放端口2.7配置安全组规则3.Docker安装4.拉取镜像5.编写Dockerf…

挂耳式蓝牙耳机哪家的好用,推荐几款实用的挂耳式耳机

时代在进步,而我们也顺势享受着进步过程中所产生的物件,就如骨传导和传统耳机,年轻人更多时候会偏向于骨传导耳机,毕竟骨传导的最大的特点就是佩戴舒适的同时,开放式耳道的设计能够更好的让中耳炎说拜拜。但近期市面上…

Hi,运维,你懂Java吗-No.3:java系统的启动

作为运维,你不一定要会写Java代码,但是一定要懂Java在生产跑起来之后的各种机制。 本文为《Hi,运维,你懂Java吗》系列文章 第三篇,敬请关注后续系列文章 欢迎关注 龙叔运维(公众号) 持续分享运…

浅谈一下:Java学习中不得不知道的:static (静态)成员

下面笔者,按照之前的Student进行简单的说明: class Student {private String name ;private int age ;private String classRoom ;//上课教室public Student(String name, int age) {this.name name;this.age age;}public void doClass() {System.out…

五、 通信协议

协议:约定,就好比我们来自不同的地方,如果都用各自的家乡话,那么肯定无法沟通,这时我们规定双方都说普通话,这样就可以沟通了,而这个规定就是“协议” 网络通信协议:速率、传输码率…

SpringCloud - 服务注册中心

文章目录1.服务注册中心2.Eureak服务注册中心2.1 Eureka服务注册与发现2.1.1 单机Eurake构建步骤(1) 创建EurekaServer服务注册中心(2) EurekaClient服务注册2.1.2 Eureka集群构建步骤(1) 创建第多个EureakServer注册中心(2) 修改host(模拟)(3) 修改YML配置2.1.3 集群配置Eurek…

搞定企业视频直播:硬件设备、直播网络环境和设备连接说明

阿酷TONY / 2022-11-22 / 原创 / 长沙 / 1.直播硬件设备 电脑硬件推荐配置: 系统:win7系统以上,macOS 10.13.6以上 显卡:独立2G显卡或以上 CPU:i5或以上 内存:4G或以上 选配硬件: …

我有 7种 实现web实时消息推送的方案,7种!

技术交流,公众号:程序员小富 大家好,我是小富~ 我有一个朋友~ 做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能。 不过…

打印机不能正常打印怎么办

第一种:更换驱动,在官网上下载相应的驱动而后安装 第一步:添加打印机和扫描仪 第二步:点击——>我需要的打印机不在列表中 第三步;①如果是USB连接则选择添加本地打印机 ②如果是网络打印机,则选择使用TCP/IP添加…

kubernetes 安装与部署

kubernetes 安装与部署 环境almalinux,centos,rockylinux,redhat的9.1版本使用containerd容器运行时kubernetes v1.25.4root用户 1.设置主机名 2.禁用防火墙 3.禁用selinux 4.禁用swap 5.同步时间 5.桥接流量 6.安装nerdctl-full 7.确认cgroup驱动默认为systemd 8.安装kubead…

Intel MediaSDK sample_decode 官方GPU解码流程学习(一) - DirectX11 D3D11和Vulkan共享资源

很久以前研究过 用NV_DX_interop扩展让D3D和OpenGL共享资源 , OpenGL在当初设计的时候电脑和操作系统还是个相对比较简单的东西,因此OpenGL API设计没有考虑到现在计算机架构的一些特性,比如多核编程和多显卡并发。最近几年出来个Vulkan来接O…

Androguard Documentation:官方文档阅读笔记

打算快速阅读下官方文档,然后做一个笔记方便查阅,文章目录按照官方文档目录来的 DOCUMENTATION Getting Started 使用 androguard axml和androguard arsc解码分析AndroidManifest.xml或者resources.arsc。 创建call graphs可以使用androguard cg&…

快消品b2b电子商务网站建设方案

互联网在改造电商行业商业运作模式和提升运营效率作用方面功不可没,目前B2B电商发展正处在交易上升期特别是B2B快消品电商,这个以万亿为单位的流通规模市场必将掀起巨大的社会价值和运营效率。当然在讨论快消品流通B2B电商行业之前,我们先简单…

C++语言的return语句的一点说明

C语言的return语句的一点说明 为了完成某一功能的程序指令(语句)的集合,称为函数。在程序中,编写函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务来解决,而且,同一个任务&#xff0…

程序员副业之无货源闲鱼

我将从以下这些方面来介绍闲鱼副业。 1. 闲鱼平台能不能挣钱? 2. 闲鱼平台都有哪几种挣钱方式? 3. 小白在闲鱼上怎么挣钱? 4. 能挣多少? 5. 如何养号? 6. 得到高权重的账号闲鱼上架该选什么商品? 7. 卖…

城市消费券,拒绝恶意爬取

作为提振经济的重要把手,城市消费券的作用不言而喻。公开数据显示,2022 年全国各地公布的消费券累计超 100 万亿,在撬动各地消费的过程中起到了举足轻重的作用。 然而,仔细分析各地的核销率就会发现,有很大一部分消费…

Zookeeper系列文章—入门

目录 前言 测试 创建节点 更改节点 删除节点 前言 遵照前文已经对Zookeeper进行了安装 linux安装Zookeeper3.5.7详解_兜兜转转m的博客-CSDN博客 接下来我们从整体架构方面了解一下Zookeeper: ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类…

安装完Vmware-tools后找不到共享文件夹的解决办法-Ubuntu 18有效

首先确认VMware-tools安装好了 如果VMware-tools一直灰色,可以根据这篇文章的方式解决:解决VMware Tools灰色的方法 设置共享文件夹 如果找不到共享文件夹,可以先尝试这个方法:共享文件夹设置方式 特殊情况解决方法 在VMware…

Java:阻塞队列BlockingQueue与应用场景

目录 阻塞队列 BlockingQueue的常用方法 生产者消费者应用场景 阻塞队列 阻塞队列BlockingQueue继承自父类Queue,该队列是线程安全的,可以安全的与多个生产者和消费者线程一起使用。 与阻塞队列相对的,存在“非阻塞队列”的概念&#xff0c…