JVM常用概念之对象初始化的成本
在JVM常用概念之新对象实例化博客中我讲到了对象的实例化,主要包含分配(TLAB)、系统初始化、用户初始化,而我在JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)博客中也讲到TLAB分配的效率是非常高的,而系统初始化和用户初始化是可以进行合并的,那最后就剩下将数据写入内存这部分的成本没有讨论过,那对于对象初始化而言,写入内存这部分的成本是怎么样的呢?我们接下来通过实例讨论一下。
实验
源码
import org.openjdk.jmh.annotations.*;@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(value = 3)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class Case {@Param({"1", "10", "100", "1000", "10000", "100000"})int size;@Benchmarkpublic byte[] java() {return new byte[size];}
}
Score
Benchmark (size) Mode Cnt Score Error Units# Time to allocate
CASE.java 1 avgt 15 20.307 ± 4.532 ns/op
CASE.java 10 avgt 15 26.657 ± 6.072 ns/op
CASE.java 100 avgt 15 106.632 ± 34.742 ns/op
CASE.java 1000 avgt 15 681.176 ± 124.980 ns/op
CASE.java 10000 avgt 15 4576.433 ± 909.956 ns/op
CASE.java 100000 avgt 15 44881.095 ± 13765.440 ns/op# Allocation rate
CASE.java:·gc.alloc.rate 1 avgt 15 6228.153 ± 1059.385 MB/sec
CASE.java:·gc.alloc.rate 10 avgt 15 6335.809 ± 986.395 MB/sec
CASE.java:·gc.alloc.rate 100 avgt 15 6126.333 ± 1354.964 MB/sec
CASE.java:·gc.alloc.rate 1000 avgt 15 7772.263 ± 1263.453 MB/sec
CASE.java:·gc.alloc.rate 10000 avgt 15 11518.422 ± 2155.516 MB/sec
CASE.java:·gc.alloc.rate 100000 avgt 15 12039.594 ± 2724.242 MB/sec
内存分配率直接由所运行机器的内存带宽/分配率决定。
热代码-汇编
0x00007f1f094f650b: movq $0x1,(%rdx) ; store mark word0.00% 0x00007f1f094f6512: prefetchnta 0xc0(%r9)0.64% 0x00007f1f094f651a: movl $0xf80000f5,0x8(%rdx) ; store klass word0.02% 0x00007f1f094f6521: mov %r11d,0xc(%rdx) ; store array length0x00007f1f094f6525: prefetchnta 0x100(%r9)0.05% 0x00007f1f094f652d: prefetchnta 0x140(%r9)0.07% 0x00007f1f094f6535: prefetchnta 0x180(%r9)0.09% 0x00007f1f094f653d: shr $0x3,%rcx0.00% 0x00007f1f094f6541: add $0xfffffffffffffffe,%rcx0x00007f1f094f6545: xor %rax,%rax0x00007f1f094f6548: cmp $0x8,%rcx╭ 0x00007f1f094f654c: jg 0x00007f1f094f655e ; large enough? jump│ 0x00007f1f094f654e: dec %rcx│╭ 0x00007f1f094f6551: js 0x00007f1f094f6565 ; zero length? jump││↗ 0x00007f1f094f6553: mov %rax,(%rdi,%rcx,8) ; small loop init│││ 0x00007f1f094f6557: dec %rcx││╰ 0x00007f1f094f655a: jge 0x00007f1f094f6553││ ╭ 0x00007f1f094f655c: jmp 0x00007f1f094f6565↘│ │ 0x00007f1f094f655e: shl $0x3,%rcx89.12% │ │ 0x00007f1f094f6562: rep rex.W stos %al,%es:(%rdi) ; large loop init0.20% ↘ ↘ 0x00007f1f094f6565: mov %r8,(%rsp)
可发现大初始化循环的内联的rep stos序列占用了大部分的时间成本。
思考
可以创建一个分配未初始化的对象吗?
实际应用场景下,创建一个分配未初始化的对象没有实际意义,而通过Unsafe可以创建分配未初始化的对象,Unsafe不遵循Java规范,有时候甚至违反JVM规范,可以通过jdk.internal.*使用它,但使用Unsafe可能导致JVM崩溃等未知的问题及风险,请谨慎使用!
源码
import jdk.internal.misc.Unsafe;
import org.openjdk.jmh.annotations.*;@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(value = 3)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class Case {static Unsafe U;static {try {Field field = Unsafe.class.getDeclaredField("theUnsafe");field.setAccessible(true);U = (Unsafe) field.get(null);} catch (Exception e) {throw new IllegalStateException(e);}}@Param({"1", "10", "100", "1000", "10000", "100000"})int size;@Benchmarkpublic byte[] unsafe() {return (byte[]) U.allocateUninitializedArray(byte.class, size);}
}
Score
Benchmark (size) Mode Cnt Score Error Units
Case.unsafe 1 avgt 15 19.766 ± 4.002 ns/op
Case.unsafe 10 avgt 15 27.486 ± 7.005 ns/op
Case.unsafe 100 avgt 15 80.040 ± 15.754 ns/op
Case.unsafe 1000 avgt 15 156.041 ± 0.552 ns/op
Case.unsafe 10000 avgt 15 162.384 ± 1.448 ns/op
Case.unsafe 100000 avgt 15 309.769 ± 2.819 ns/opCase.unsafe:·gc.alloc.rate 1 avgt 15 6359.987 ± 928.472 MB/sec
Case.unsafe:·gc.alloc.rate 10 avgt 15 6193.103 ± 1160.353 MB/sec
Case.unsafe:·gc.alloc.rate 100 avgt 15 7855.147 ± 1313.314 MB/sec
Case.unsafe:·gc.alloc.rate 1000 avgt 15 33171.384 ± 153.645 MB/sec
Case.unsafe:·gc.alloc.rate 10000 avgt 15 315740.299 ± 3678.459 MB/sec
Case.unsafe:·gc.alloc.rate 100000 avgt 15 1650860.763 ± 14498.920 MB/sec
热代码-汇编
0x00007f65fd722c74: prefetchnta 0xc0(%r11)66.06% 0x00007f65fd722c7c: movq $0x1,(%rax) ; store mark word0.40% 0x00007f65fd722c83: prefetchnta 0x100(%r11)4.43% 0x00007f65fd722c8b: movl $0xf80000f5,0x8(%rax) ; store class word0.01% 0x00007f65fd722c92: mov %edx,0xc(%rax) ; store array length0x00007f65fd722c95: prefetchnta 0x140(%r11)5.18% 0x00007f65fd722c9d: prefetchnta 0x180(%r11)4.99% 0x00007f65fd722ca5: mov %r8,0x40(%rsp)0x00007f65fd722caa: mov %rax,%rdx
将元数据写入内存占用了大部分时间成本。
相关文章:
JVM常用概念之对象初始化的成本
在JVM常用概念之新对象实例化博客中我讲到了对象的实例化,主要包含分配(TLAB)、系统初始化、用户初始化,而我在JVM常用概念之线程本地分配缓冲区(ThreadLocal Allocation Buffer,TLAB)博客中也讲…...
[AI机器人] Web-AI-Robot机器人前瞻版--比奇堡海之霸凯伦
文章目录 简述开源Web-AI-Robot 项目-比奇堡-海之霸-凯伦 技术架构效果预览 简述 本项目配合前端项目bikini_bottom_karen_ui运行,来源于柒杉工作室(截止2025.2,目前我自己)。 打造一个只需要在浏览器上运行的AI智能机器人&#…...
嵌入式学习-EXTI外部中断
STM32 是一种基于 ARM Cortex-M 内核的微控制器系列,广泛应用于嵌入式系统开发。中断(Interrupt)是 STM32 中一个非常重要的功能,它允许微控制器在执行主程序的同时,响应外部事件或内部事件的请求,从而实现…...
CSS—元素水平居中:2分钟掌握常用的水平居中
个人博客:haichenyi.com。感谢关注 1. 目录 1–目录2–行内元素水平居中3–块级元素水平居中 2. 行内元素水平居中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" …...
PyTorch 中结合迁移学习和强化学习的完整实现方案
结合迁移学习(Transfer Learning)和强化学习(Reinforcement Learning, RL)是解决复杂任务的有效方法。迁移学习可以利用预训练模型的知识加速训练,而强化学习则通过与环境的交互优化策略。以下是如何在 PyTorch 中结合…...
大语言模型学习--本地部署DeepSeek
本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…...
Linux:vim快捷键
Linux打开vim默认第一个模式是:命令模式! 命令模式快捷键操作: gg:光标快速定位到最开始 shift g G:光标快速定位到最结尾 n shift g n G:光标快速定位到第n行 shift 6 ^:当前行开始 …...
Unity 对象池技术
介绍 是什么? 在开始时初始化若干对象,将它们存到对象池中。需要使用的时候从对象池中取出,使用完后重新放回对象池中。 优点 可以避免频繁创建和销毁对象带来性能消耗。 适用场景 如果需要对某种对象进行频繁创建和销毁时,例…...
算法1-4 凌乱的yyy / 线段覆盖
题目描述 现在各大 oj 上有 n 个比赛,每个比赛的开始、结束的时间点是知道的。 yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。 所以,他想知道他最多能参加几个比赛。 由于 yyy 是蒟蒻,…...
【计网】数据链路层
数据链路层 3.1 数据链路层概述3.2 封装成帧3.3 差错检测3.4 可靠传输3.4.1 可靠传输的概念3.4.2 可靠传输的实现机制 - 停止等待协议3.4.3 可靠传输的实现机制 -回退N帧协议3.4.4 可靠传输的实现机制 -选择重传协议 3.5 点对点协议3.5.1 帧格式3.5.2 透明传输 3.6 媒体接入控制…...
javaweb自用笔记:Vue
Vue 什么是vue vue案例 1、引入vue.js文件 2、定义vue对象 3、定义vue接管的区域el 4、定义数据模型data 5、定义视图div 6、通过标签v-model来绑定数据模型 7、{{message}}直接将数据模型message展示出来 8、由于vue的双向数据绑定,当视图层标签input里的…...
CSS Overflow 属性详解
CSS Overflow 属性详解 在网页设计和开发中,CSS Overflow 属性是一个非常重要的特性,它决定了当内容超出其容器大小时应该如何处理。本文将详细介绍 CSS Overflow 属性的相关知识,包括其语法、作用、常用属性值以及一些实际应用场景。 1. CSS Overflow 属性概述 CSS Over…...
沃丰科技结合DeepSeek大模型技术落地与应用前后效果对比
技术突破:DeepSeek算法创新,显著降低了显存占用和推理成本。仅需少量标注数据即可提升推理能力。这种突破减少了对海量数据的依赖,削弱了数据垄断企业的优势! 商业模式颠覆:DeepSeek选择完全开源模式,迫使…...
突破光学成像局限:全视野光学血管造影技术新进展
全视野光学血管造影(FFOA)作为一种实时、无创的成像技术,能够提取生物血液微循环信息,为深入探究生物组织的功能和病理变化提供关键数据。然而,传统FFOA成像方法受到光学镜头景深(DOF)的限制&am…...
2.反向传播机制简述——大模型开发深度学习理论基础
在深度学习开发中,反向传播机制是训练神经网络不可或缺的一部分。它让模型能够通过不断调整权重,从而将预测误差最小化。本文将从实际开发角度出发,简要介绍反向传播机制的核心概念、基本流程、在现代网络中的扩展,以及如何利用自…...
机器学习校招面经二
快手 机器学习算法 一、AUC(Area Under the ROC Curve)怎么计算?AUC接近1可能的原因是什么? 见【搜广推校招面经四】 AUC 是评估分类模型性能的重要指标,用于衡量模型在不同阈值下区分正负样本的能力。它是 ROC 曲线…...
Spring Boot如何利用Twilio Verify 发送验证码短信?
Twilio提供了一个名为 Twilio Verify 的服务,专门用于处理验证码的发送和验证。这是一个更为简化和安全的解决方案,适合需要用户身份验证的应用。 使用Twilio Verify服务的步骤 以下是如何在Spring Boot中集成Twilio Verify服务的步骤: 1.…...
毕业项目推荐:基于yolov8/yolo11的苹果叶片病害检测识别系统(python+卷积神经网络)
文章目录 概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式)功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...
Linux的用户与权限--第二天
认知root用户(超级管理员) root用户用于最大的系统操作权限 普通用户的权限,一般在HOME目录内部不受限制 su与exit命令 su命令: su [-] 用户名 -符号是可选的,表示切换用户后加载环境变量 参数为用户名,…...
【Flink银行反欺诈系统设计方案】1.短时间内多次大额交易场景的flink与cep的实现
【flink应用系列】1.Flink银行反欺诈系统设计方案 1. 经典案例:短时间内多次大额交易1.1 场景描述1.2 风险判定逻辑 2. 使用Flink实现2.1 实现思路2.2 代码实现2.3 使用Flink流处理 3. 使用Flink CEP实现3.1 实现思路3.2 代码实现 4. 总结 1. 经典案例:短…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
