《JVM由浅入深学习【四】 2023-12-24》JVM由简入深学习提升分享

JVM由简入深学习提升分享四

  • 1.JVM中java堆的特点及作用
  • 2. JVM中对象如何在堆内存中分配
  • 3. JVM堆内存中的对象布局

1.JVM中java堆的特点及作用

  • 是线程共享的一块区域
  • 虚拟机启动时就创建了
  • 是虚拟机中内存占用很大的一块
  • 存放所有的实例对象和数组
  • GC主要的作用区域
  • 可分为新生代(刚创建)和老年代(存活很久)
  • 新生代更细化可分为Eden,From Survivor,To Survivor,比例为8:1:1
    jvm堆结构图
  • 可以通过-Xms,-Xmx调节堆大小
  • 如果从分配内存的角度看,所有线程共享的 Java 堆中可以划分出多个线程私有的分配缓冲区 (Thread Local Allocation Buffer,TLAB) ,以提升对象分配时的效率
  • 无法在拓展:java.lang.OutOfMemoryError: Java heap space
    例子:模拟OOM,设置JVM参数-Xmx128m -Xms128m,这里最大最小都设置128M,我的Customer里面有个bytes变量,一个就有1m,所以每个CUstomer都多于1M,所以运行程序customerList长度到达一定次数就OOM了
    在这里插入图片描述
@Data
public class Customer {private int no;private String username;private BigDecimal money;private byte[] a = new byte[1024 * 1024]; // 这里1024*1024byte等于1m
}
public class MyTestOOM {public static void main(String[] args) {List<Customer> customerList = new ArrayList<>();while (true) {Customer customer = new Customer();customer.setNo(1);customer.setUsername("testOOM");customer.setMoney(new BigDecimal("1000"));customerList.add(customer);System.out.println(customerList.size());}}
}

在这里插入图片描述

2. JVM中对象如何在堆内存中分配

  1. 指针碰撞(Bump The Poniter):内存规整的情况下
  2. 空闲列表(Free List):内存不规整的情况下
    以上两种方式要看垃圾回收器是否有空间压缩整理的能力来决定
  • 例如Serial,ParNew有有带压缩整理能力的收集器,则采用的是指针碰撞,简单高效
  • 例如CMS这种基于清除(Sweep)算法的收集器时,理论上采用较为复杂的空间列表分配方式
  1. 本地线程分配缓冲(TLAB):对象创建在虚拟机中频繁发生,即使仅仅修改一个指针所指向的位置,在并发情况下也并不是线程安全的,可能出现正在给对象 A分配内存,指针还没来得及修改,对象 B 又同时使用了原来的指针来分配内存的情况;
    两种解决方案
  • 同步锁定:JVM 是采用 CAS 配上失败重试的方式保证更新操作的原予性,
  • 线程锁定:把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在 Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer,TLAB),哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定,虚拟机是否使用TLAB,可以通过-XX: +/-UseTLAB 参数来设定,-XX:TLABSize=512k设置大小
    在这里插入图片描述
    在这里插入图片描述
    java -XX:+PrintFlagsFinal来打印信息,可找到TLAB,默认开启,自动分配容量
    在这里插入图片描述

3. JVM堆内存中的对象布局

  • 在 HotSpot 虚拟机中,一个对象的存储结构分为 3 块区域: 对象头(Header)、:实例数据(Instance Data) 和 对齐填充(Padding)
  • 对象头(Header): 包含两部分,
    • 第一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等,32 位虚拟机占 32 bit.64 位虚拟机占 64 bit,官方称为 “Mark Word’
    • 第二部分是类型指针,即对象指向它的类的元数据指针,虚拟机通过这个指针确定这个对象是哪个类的实例,另外,如果是Java 数组,对象头中还必须有一块用于记录数组长度的数据因为普通对象可以通过 Java 对象元数据确定大小,而数组对象不可以;
  • 实例数据(Instance Data): 程代码中所定义的各种成员变量类型的字段内容(包含父类继承下来的和子类中定义的);
  • 对齐填充(Padding): 不是必然需要,主要是占位,保证对象大小是某个字节的整数倍,HotSpot 虚拟机,任何对象的大小都是 8 字节的整数倍。如果不是整数倍就靠这个填充

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

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

相关文章

初学者快速入门学习日语,PDF文档音频教学资料合集

一、资料描述 本套学习资料是很全面的&#xff0c;共有734份文件&#xff0c;包括PDF&#xff0c;PPT&#xff0c;表格&#xff0c;图片&#xff0c;音频等多种格式&#xff0c;可以作为初级日语的学习教材&#xff0c;也是非常适合初学者入门的&#xff0c;可以帮助大家快速的…

Nginx(十三) 配置文件详解 - 反向代理(超详细)

本篇文章主要讲ngx_http_proxy_module和ngx_stream_proxy_module模块下各指令的使用方法。 1. 代理请求 proxy_pass 1.1 proxy_pass 代理请求 Syntax: proxy_pass URL; Default: — Context: location, if in location, limit_except 设置代理服务器的协议和地址以…

使用Redis进行搜索

文章目录 构建反向索引 构建反向索引 在Begin-End区域编写 tokenize(content) 函数&#xff0c;实现文本标记化的功能&#xff0c;具体参数与要求如下&#xff1a; 方法参数 content 为待标记化的文本&#xff1b; 文本标记的实现&#xff1a;使用正则表达式提取全小写化后的…

初识Java并发,一问读懂Java并发知识文集(1)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

数据库索引、三范式、事务

索引 索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树&#xff08;B-tree&#xff09;。 常见索引原则有 选择唯一性索引&#xff1a;唯一性索引的值是唯…

树与二叉树笔记整理

摘自小红书 ## 树与二叉树 ## 排序总结

eclipse中更改jdk版本

文章目录 步骤1&#xff1a;installed JREs步骤2&#xff1a;选择已安装的jdk步骤3&#xff1a;项目配置 步骤1&#xff1a;installed JREs 在eclipse上方工具栏找到Window -->Preferences,如下图所示&#xff1a; 选择Installed JREs 点击 Add 按钮&#xff0c; 选择Stand…

【字典树Trie】LeetCode-139. 单词拆分

139. 单词拆分。 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode&q…

MySQL是如何保证数据一致性的?

文章目录 前言MySQL保证的一致性MySQL发生不一致环节并发冲突redolog不完整binlog&redolog不一致 MySQL解决不一致方案加锁解决并发冲突undolog解决redolog不完整XA两阶段提交解决binlog和redolog的不一致 总结 前言 通过上文《MySQL是如何保证数据不丢失的&#xff1f;》…

Ubuntu安装CUDA出在三个cuda相关文件夹?

按照网上的教程&#xff0c;在/usr/local中操作cuda文件夹&#xff0c;但是发现这里会出现不止一个cuda文件夹&#xff1a; 可以看大这里有cuda、cuda-11、cuda-11.8三个文件夹&#xff0c;实际上我安装的是11.8的cuda&#xff0c;那么第三个文件是好理解的&#xff0c;就是我…

Django Web框架

1、创建PyCharm项目 2、安装框架 pip install django4.2.0 3、查看安装的包列表 4、使用命令创建django项目 django-admin startproject web 5、目录结构 6、运行 cd web python manage.py runserver7、初始化后台登录的用户名密码 执行数据库迁移生成数据表 python man…

【Redis交响乐】Redis中的数据类型/内部编码/单线程模型

文章目录 一. Redis中的数据类型和内部编码二. Redis的单线程模型面试题: redis是单线程模型,为什么效率之高,速度之快呢? 在上一篇博客中我们讲述了Redis中的通用命令,本篇博客中我们将围绕每个数据结构来介绍相关命令. 一. Redis中的数据类型和内部编码 type命令实际返回的…

【MATLAB】EMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EMD-LSTM神经网络时序预测算法是一种结合了经验模态分解&#xff08;EMD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 EMD是一种处理非平稳信号的…

Linux的引导过程与服务控制

一.开机启动的完整过程 引导过程&#xff1a; 1.bios加电自检 检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 服务器主机开机以后&#xff0c;将根据主板BIOS中的设置对CPU、内存、显卡、键盘灯设备进行初步检测&#xff0c;检测成功后根…

stable diffusion 基础教程-图生图

界面 图生图大概有以下几个功能: 图生图涂鸦绘制局部绘制局部绘制(涂鸦蒙版)其常用的也就上面四个,接下来逐步讲解。 以图反推提示词 图生图可以根据反推提示词来获取相应图片的提示词,目前3种主流方式,如下: CLIP反推提示词:推导出的文本倾向于自然语言的描述方式,…

openmediavault(OMV) (26)网络(1)ddns-go

简介 "ddns-go" 是一个动态域名解析(Dynamic DNS)工具,用于更新域名的IP地址。它可以自动检测你的公共IP地址,并将其更新到指定的域名解析服务商,以确保你的域名始终与最新的IP地址相匹配。 安装 hub.docker.com上下载ddns-go镜像 配置compose文件 --- versio…

在 sealos 上使用 redisinsight 完美管理 redis

先起一个 redis 集群&#xff0c;在 sealos 上可以点点鼠标就搞定&#xff1a; 简单两步&#xff0c;redis 集群搞定。 再启动 RedisInsight, 是一个 redis 的可视化管理工具。 就可以看到部署后的地址了。进去之后填写 redis 的链接信息即可&#xff1a; 链接信息在数据库的…

STM32MP157/linux驱动学习记录

1. uboot烧录 2.linux安装nfs服务 sudo apt-get install nfs-kernel-server rpcbind安装nfs服务 在用户根目录下创建一个名为“linux”的文件夹&#xff0c;以后所有的东西都放到这个“linux”文件夹里面&#xff0c;在“linux”文件夹里面新建一个名为“nfs”的文件夹&#…

代码训练营Day.22 | 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 1. LeetCode链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2. 题目描述 3. 解法 利用二叉搜索树的特性进行公共节点的判断&#xff1a; 1. 此节点为公共节点&#xff1a;p、q恰好在此节点的左右棵子树上。即…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器 从稳态误差入手&#xff08;steady state Error&#xff09; 误差 Error &#xff1a; E ( s ) R ( s ) − X ( s ) R ( s ) − E ( s ) ⋅ K G …