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

将元数据写入内存占用了大部分时间成本。

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

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

相关文章

java后端开发day27--常用API(二)正则表达式爬虫

(以下内容全部来自上述课程) 1.正则表达式(regex) 可以校验字符串是否满足一定的规则,并用来校验数据格式的合法性。 1.作用 校验字符串是否满足规则在一段文本中查找满足要求的内容 2.内容定义 ps:一…

AI---DevOps常备工具(‌AI-Integrated DevOps Essential Tools)

AI---DevOps常备工具 技术领域正在迅速发展,随着我们步入 2025 年,有一点是明确的:人工智能(AI)不再只是一个流行词,它是每个 DevOps 工程师都需要掌握的工具。随着云环境的复杂性增加、对更快部署的需求以…

Pytorch中的主要函数

目录 一、torch.manual_seed(seed)二、torch.cuda.manual_seed(seed)三、torch.rand(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧五、torch.version.cuda;torch.bac…

Spring Boot中对接Twilio以实现发送验证码和验证短信码

Twilio介绍 Twilio是一家提供云通信服务的公司,旨在帮助开发者和企业通过简单的API实现各种通信功能。以下是Twilio的一些主要特点和服务介绍: 核心功能 短信服务(SMS):允许用户通过API发送和接收短信,支…

VSCode详细安装步骤,适用于 Windows/macOS/Linux 系统

以下是 Visual Studio Code (VSCode) 的详细安装步骤,适用于 Windows/macOS/Linux 系统: VSCode 的详细安装步骤 一、Windows 系统安装1. 下载安装包2. 运行安装程序3. 验证安装 二、macOS 系统安装1. 方法一:官网下载安装包2. 方法二&#x…

基于PyTorch的深度学习3——基于autograd的反向传播

反向传播,可以理解为函数关系的反向传播。

设备管理系统功能与.NET+VUE(IVIEW)技术实现

在现代工业和商业环境中,设备管理系统(Equipment Management System,简称EMS)是确保设备高效运行和维护的关键工具。本文采用多租户设计的设备管理系统,基于.NET后端和VUE前端(使用IVIEW UI框架&#xff09…

PHP之特性

在你有别的编程语言的基础下&#xff0c;你想学习PHP&#xff0c;可能要了解的PHP特有的东西。 定界符 使用<<<TT(可以是任意字符&#xff0c;但是不可以在别的地方使用过)和TT&#xff0c;会解析html格式和变量&#xff0c;如果在<<<后面加上单引号就会不…

9-Agent大模型中工作流的使用方法分析

目录 关键词 摘要 速览 配置插件进行新闻内容查找的工作流设置 自动化调用用户输入变量的插件配置教程 配置大模型以整理并简要输出新闻内容 新闻内容总结功能调试与优化 搭建与发布工作流优化布局的流程详解 创建和配置智能体工作流程 调试页面与工作流配置演示 思…

记一次:泛微OA集成Mybatis后 insert/update执行成功,但未真正插入或修改数据

背景&#xff1a;通过Mybatis插入数据或更新数据&#xff0c;显示插入/更新成功&#xff0c;查询数据库&#xff0c;发现并未插入成功、数据也没更新成功。下面是Mapper文件 public interface TestOrmMapper {int insertByTest(Param("requestId") Integer requestI…

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控

使用 Spring Boot 实现前后端分离的海康威视 SDK 视频监控系统&#xff0c;可以分为以下几个步骤&#xff1a; 1. 系统架构设计 前端&#xff1a;使用 Vue.js、React 或 Angular 等前端框架实现用户界面。后端&#xff1a;使用 Spring Boot 提供 RESTful API&#xff0c;负责与…

【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析

DeepSeek-V3技术报告 目录 DeepSeek-V3技术报告 1. 摘要 2. 引言 3. DeepSeek V3 架构 3.1 基础架构 3.1.1. 多头潜在注意力 3.1.2. DeepSeekMoE和无辅助损失的负载均衡 3.2 多令牌预测 4. 基础设施 4.1 计算集群 4.2 训练框架 4.2.1. DualPipe算法与计算通信协同优…

负载均衡 - 一致性hash算法

构建场景 假如我们有三台缓存服务器编号node0、node1、node2&#xff0c;现在有3000万个key&#xff0c;希望可以将这些个key均匀的缓存到三台机器上&#xff0c;你会想到什么方案呢&#xff1f; 我们可能首先想到的方案&#xff0c;是取模算法hash&#xff08;key&#xff0…

pdfplumber 解析 PDF 表格的原理

&#x1f4cc; pdfplumber 解析 PDF 表格的原理 pdfplumber 处理表格的原理是基于几何分析&#xff08;geometric analysis&#xff09;&#xff0c;它通过分析 PDF 页面中的线条、单元格间距和文本分布&#xff0c;提取表格数据。它主要利用 垂直线&#xff08;vertical line…

洛谷P1334

题目如下 思路&#xff1a; 每次选择最短的两块木板进行合并&#xff0c;直到只剩下一块木板。使用最小堆&#xff08;优先队列&#xff09;来实现这一过程。使用最小堆&#xff1a; 将所有木板的长度放入最小堆&#xff08;优先队列&#xff09; 每次从堆中取出两块最短的木…

JVM(Java Virtual Machine,Java 虚拟机)的作用

JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;的作用至关重要&#xff0c;它是 Java 语言“一次编写&#xff0c;到处运行”&#xff08;Write Once, Run Anywhere&#xff0c;WORA&#xff09;特性的基石&#xff0c;也是 Java 平台的核心组成部分…

总结(尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程)

1.Vue简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece 1.1.性能的提升 打包大小减少41%。 初次渲染快55%, 更新渲染快133%。 内存减少54%。 1.2.源码的升级 使用Proxy代替defineProperty实现响应式。 重写虚拟DOM的实现和Tree-Shak…

SolidWorks 转 PDF3D 技术详解

在现代工程设计与制造流程中&#xff0c;不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式&#xff0c;能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项&#xff0c;…

【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解

摘要 本文分类使用的是resNet34,什么不用yolo v8&#xff0c;yolo v10系列,虽然他们也可以分类&#xff0c;因为yolo系列模型不纯粹&#xff0c;里面包含了目标检测的架构&#xff0c;所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…

OPPO Find N5折叠手机:创新与实用的完美融合,FPC应用展现科技魅力【新立电子】

OPPO Find N5作为2025年新出世的折叠手机&#xff0c;以其卓越的设计、强大的性能以及创新的技术&#xff0c;为消费者带来了全新的使用体验。FPC&#xff08;柔性电路板&#xff09;在其中的运用&#xff0c;也进一步提升了手机的整体性能和用户体验。 OPPO Find N5的最大亮点…