《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.hqwc.cn/news/317164.html

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

相关文章

EndNote 21 for Mac/win:文献管理的革命性工具

随着学术研究的深入&#xff0c;文献管理变得日益重要。然而&#xff0c;许多研究者面临着文献检索、整理和引用等难题。EndNote 21是一款强大的文献管理软件&#xff0c;它不仅简化了文献检索和整理的过程&#xff0c;还提供了丰富的文献引用功能&#xff0c;让研究者能够更高…

securecrt连接桥接方式上网的虚拟机

注意第二步不用root账户登录&#xff0c;使用普通用户名&#xff0c;我这里用的是hunk 如果是用第二步用的是root The server has disconnected with an error. Server message reads: A protocol error occurred. Change of username or service not allowed: (root,ssh-con…

window下载安装Mongodb数据库

我们先要访问他的官网 https://www.mongodb.com/zh-cn 然后顶部导航栏 选择 (Products/产品) 下的 (Community Edition/社区版) 进入界面后 找到 MongoDB Community Server Download 点击下面的按钮 Select package 然后会弹到这个位置 第一个版本 用系统默认选择的就好 第二…

zabbix 批量添加主机

项目地址 GitCode项目地址 效果图 下载pycharm用于项目适配 PyCharm下载地址 注意下滑鼠标下载社区版 打开软件后下载中文插件 下载Git用于克隆GitHub项目 Git下载地址 具体操作可参考 下载Python用于用于项目适配 Python3.7.0下载地址 具体操作可参考 下载FastGithub用…

第二十五章 JDBC 和数据库连接池

一、JDBC 概述&#xff08;P821&#xff09; 1. 基本介绍 &#xff08;1&#xff09;JDBC 为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 &#xff08;2&#xff09;Java 程序员使用 JDBC&#xff0c;可以连接任何提供了 JDBC 驱动程序的数据库系统…

短剧付费变现小程序源码系统 附带完整的安装部署教程

随着互联网的快速发展&#xff0c;短剧市场呈现出爆炸性的增长。然而&#xff0c;短剧创作者和投资者面临着如何将内容变现的难题。为了解决这一问题&#xff0c;罗峰给大家分享一款短剧付费变现小程序源码系统。该系统不仅为短剧创作者提供了便捷的变现渠道&#xff0c;同时也…

游泳耳机怎么选?口碑最好的游泳耳机推荐

游泳是一种全身的有氧运动&#xff0c;可以锻炼身体的各个部位&#xff0c;提高身体的免疫力。而游泳耳机则是在游泳时帮助人们更好地享受音乐、播客、有声读物等娱乐内容。 不过选择适合自己的游泳耳机时&#xff0c;还是要多考虑&#xff0c;所以为了帮助大家更好的选择耳机&…

STM32——F407定时器概述

1 定时器分类 定时器类型数量位号位宽时钟捕获/比较输出DMA请求计数互补输出基本2TIM6,TIM716bitAPB1-有递增-通用2TIM2,TIM532bitAPB14通道有递增、递减、中心对齐-通用2TIM3,TIM432bitAPB14通道有递增、递减、中心对齐-通用1TIM916bitAPB14通道有递增-通用2TIM10、TIM1116bi…

颈椎病药物,目前市场规模已超过200亿美元

颈椎病是一种常见的疾病&#xff0c;药物治疗是其重要的治疗手段之一。全球颈椎病药物市场分析&#xff1a; 在全球市场中&#xff0c;颈椎病药物主要包括非甾体类抗炎药、肌肉松弛剂、神经营养素等。根据市场调查数据&#xff0c;目前全球颈椎病药物市场规模已超过200亿美元&a…

【Webpack】资源输入输出 - 配置资源入口

资源处理流程 Webpack 中的资源处理流程 在一切流程的最开始&#xff0c;首先需要指定一个或多个人口(entry)&#xff0c;也就是告诉Webpack具体从源码目录下的哪个文件开始打包。如果把工程中各个模块的依赖关系当作一棵树&#xff0c;那么入口就是这棵依赖树的根 这些存在依…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-9PID控制器&#xff09; P —— Proportional I —— Integral D —— Derivative 当前误差/过去误差/误差的变化趋势 K p ⋅ e K_{\mathrm{p}}\cdot e Kp​⋅e&#xff1a;比…

C++ DAY5 作业

1.全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp.int attck;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数void Atk()blood-0;}&#xff0c;法师类继承自英雄类&#xff0c;私有属性int ap_atk50…