AtomicIntegerFieldUpdater能否降低内存

1. 代码如下:


import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerTest {final AtomicInteger startPosition = new AtomicInteger(0);final AtomicInteger wrotePosition = new AtomicInteger(0);final AtomicInteger committedPosition = new AtomicInteger(0);final AtomicInteger flushedPosition = new AtomicInteger(0);public static void main(String[] args) throws Exception {List<AtomicIntegerTest> list = new LinkedList<>();for (int i = 0; i < 1000000; i++) {list.add(new AtomicIntegerTest());}System.out.println("create instances 1000000");System.in.read();}
}

使用profiler 分析内存如下:
内存大小
从上图可以看出来AtomicInteger 大概占用了64M。而AtomicIntegerTest对象实例整个占用了96M.

2. 修改之后代码如下:


import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;public class AtomicIntegerFieldUpdaterTest {public static final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> startPosition =  AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,"startPositionInt");public static final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> wrotePosition = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,"wrotePositionInt");public static final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> committedPosition = AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,"committedPositionInt");public static final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> flushedPosition =AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,"flushedPositionInt");private volatile int startPositionInt = 0;private volatile int wrotePositionInt = 0;private volatile int committedPositionInt = 0;private volatile int flushedPositionInt = 0;public static void main(String[] args) throws Exception{List<AtomicIntegerFieldUpdaterTest> list = new LinkedList<>();for (int i = 0; i < 1000000; i++) {list.add(new AtomicIntegerFieldUpdaterTest());}System.out.println("create instances 1000000");System.in.read();}
}

使用profiler 分析内存如下:
在这里插入图片描述
AtomicIntegerFieldUpdaterTest整个对象大小的和为32M,相比之前的总共小了64M。大大的减少了内存的开销。

AtomicIntegerFieldUpdater如何使用

AtomicIntegerFieldUpdater必须是静态变量
被更新的变量必须被关键字volatile修饰

public class AtomicIntegerFieldUpdaterTest {public static final AtomicIntegerFieldUpdater<AtomicIntegerFieldUpdaterTest> startPosition =  AtomicIntegerFieldUpdater.newUpdater(AtomicIntegerFieldUpdaterTest.class,"startPositionInt");private volatile int startPositionInt = 0;
}

4. 使用AtomicIntegerFieldUpdater后内存为什么会减少

代码如下:


import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;class FieldUpdaterTest {public volatile int a = 0;private static final AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(FieldUpdaterTest.class, "a");
}class AtomicTest22 {public volatile int a = 0;private AtomicInteger atomicInteger = new AtomicInteger(0);
}public class T {public static void main(String[] args) {FieldUpdaterTest test = new FieldUpdaterTest();System.out.println(ClassLayout.parseInstance(test).toPrintable());AtomicTest22 test2 = new AtomicTest22();System.out.println(ClassLayout.parseInstance(test2).toPrintable());}
}

结果如下:

org.example.jucdemo2.atomic.FieldUpdaterTest object internals:
OFF  SZ   TYPE DESCRIPTION               VALUE0   8        (object header: mark)     0x0000000000000001 (non-biasable; age: 0)8   4        (object header: class)    0x0100120012   4    int FieldUpdaterTest.a        0
`Instance size: 16 bytes`
Space losses: 0 bytes internal + 0 bytes external = 0 bytes totalorg.example.jucdemo2.atomic.AtomicTest22 object internals:
OFF  SZ                                        TYPE DESCRIPTION                  VALUE0   8                                             (object header: mark)        0x0000000000000001 (non-biasable; age: 0)8   4                                             (object header: class)       0x0101f0a812   4                                         int AtomicTest22.a               016   4   java.util.concurrent.atomic.AtomicInteger AtomicTest22.atomicInteger   (object)20   4                                             (object alignment gap)       
`Instance size: 24 bytes`
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

可以看到,FieldUpdaterTest比AtomicTest少了8 bytes。仔细分析上图结果,我们发现后者比前者多了4 bytes 大小的AtomicInteger对象,这也正是AtomicInteger中的成员变量int value,而AtomicIntegerFieldUpdater是staic final类型,即类变量,并不会占用当前对象的内存。正是基于AtomicIntegerFieldUpdater该使用特性,当字段所属的类会被创建大量的实例时,如果用AtomicInteger每个实例里面都要创建AtomicInteger对象,从而多出很多不必要的内存消耗。

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

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

相关文章

Jmeter进阶篇(28)结合AI做性能测试:开启性能测试自动化新篇章

📚前言 在当今快速发展的软件测试领域里,性能测试的重要性正在日益凸显。Apache Jmeter 作为一款强大的性能测试工具,目前正在测试行业里被广泛应用。然而,手动编写 Jmeter 的测试脚本,往往是一个繁琐且耗时的过程,我们需要添加请求头,HTTP请求,监听器,断言,再配置…

Java中 HttpURLConnection 和 HttpClient 详解(初学者友好)

Java中HttpURLConnection和HttpClient详解&#xff08;初学者友好&#xff09; 在Java开发中&#xff0c;向服务器发送HTTP请求是常见的需求&#xff0c;比如调用API接口或获取远程数据。在JDK中&#xff0c;主要有两种方式实现HTTP通信&#xff1a; 使用 HttpURLConnection&…

从零开始:使用Vite和pnpm搭建Vue3项目实战指南

目录 一、Node.js的下载和安装 1、打开Node.js官网&#xff08;Node.js — Run JavaScript Everywhere&#xff09; 2、点击下载按钮&#xff0c;下载完成后&#xff0c;打开文件&#xff0c;一直按Next按钮&#xff0c;直到 3、下载完成后,找到文件所在位置&#xff0c;然…

立创庐山派 K230 RTSP 推流

立创庐山派使用的是K230芯片&#xff0c;按照教程刷了canmv固件&#xff0c;下载canmv ide&#xff0c;使用嘉楠社区的rtsp和wlan例程&#xff0c;修改成连接wifi以及RTSP推流例程 # Description: This example demonstrates how to stream video and audio to the network us…

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子&#xff0c;还有数据中台、数据湖、数据仓库、数据集市的区别的帖子&#xff0c;发现帖子写的都很多&#xff0c;而且专业名词很多&am…

Multkan

以下是KAN class的逐行解释&#xff0c;这个类是一个用于构建基于核激活网络&#xff08;KAN&#xff09;的神经网络模型的Python类&#xff1a; class KAN:定义一个名为KAN的类。 Attributes:以下部分列出了KAN类的属性&#xff0c;这些属性描述了类的状态和行为。 grid : int…

【案例】权限管理

数据库表结构 models.py from django.db import modelsclass Permission(models.Model):""" 权限表 """code models.CharField(verbose_name"路由名称", max_length32)name models.CharField(verbose_name"名称", max_le…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据&#xff0c;笔者在今年10月写了文章&#xff0c;怎么使用配置化实现kafka的装载&#xff1a;springboot kafka多数据源&#xff0c;通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中&#xff0c;kafka broker是加密的&#xff0c…

在Windows下编译支持https的wsdl2h

下载源码 在官网下载源码 安装Openssl 下载OpenSSL并安装&#xff0c;安装完成后需要将OpenSSL的路径添加到环境变量中 配置VS 1、打开工程 2、因为前面安装的OpenSLL是64位的&#xff0c;因此需要创建一个X64的配置 打开配置管理器&#xff0c;然后选择新建&#xff0…

【Webgl_glslThreejs】制作流水效果/毛玻璃效果材质

效果预览 shadertory源码 source&#xff1a; https://www.shadertoy.com/view/lldyDs 材质代码 import { DoubleSide, ShaderChunk, ShaderMaterial, TextureLoader } from "three"; /** * * source https://www.shadertoy.com/view/lldyDs */export default fu…

个性化联邦学习方法

基于知识蒸馏的个性化联邦学习方法 基于 Logit 的知识蒸馏方法&#xff1a; 基于 logit 的知识蒸馏方法也是知识蒸馏中的一种常见技术。通常&#xff0c;logit 是指模型输出的原始预测值&#xff08;未经过 softmax 函数处理的类别分数&#xff09;。在知识蒸馏中&#xff0c;…

《解锁决策树算法:机器学习领域的实用利器及其多面应用》

一、引言 在当今数据驱动的时代&#xff0c;机器学习正深刻改变着我们生活与工作的方方面面&#xff0c;而决策树算法作为其中的经典算法&#xff0c;凭借直观易懂、高效实用的优势&#xff0c;在众多领域都占据着重要地位。本文将带领大家全方位深入探究决策树算法&#xff0…

vue3+ts+uniapp微信小程序顶部导航栏

这是colorui改的&#xff0c;不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…

【AI战略思考13】克服懒惰,保持专注,提升效率,不再焦虑

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 引言 我发现自己最近非常懒惰&#xff0c;浪费了很多时间&#xff0c;也容易分心&#xff0c;不够专注&#xff0c;效率低下&#xff0c;且每天都有点焦虑&#xff0c;因此制定了下面的要求和作息时间表。 目…

Unity3D ngui和ugui区别与优缺点详解

前言 Unity3D是一款跨平台的游戏开发引擎&#xff0c;它支持多种平台&#xff0c;包括PC、移动设备和主机。在Unity3D中&#xff0c;UI系统是游戏开发中非常重要的一部分&#xff0c;它负责游戏中的用户界面的显示和交互。 对惹&#xff0c;这里有一个游戏开发交流小组&#…

openssl使用哈希算法生成随机密钥

文章目录 一、openssl中随机数函数**OpenSSL 随机数函数概览**1. **核心随机数函数** **常用函数详解**1. RAND_bytes2. RAND_priv_bytes3. RAND_seed 和 RAND_add4. RAND_status **随机数生成器的熵池****常见用例****注意事项** 二、使用哈希算法生成随机的密钥 一、openssl中…

大模型翻译能力评测

1. 背景介绍 随着自然语言处理技术的飞速发展&#xff0c;机器翻译已经成为一个重要的研究领域。近年来&#xff0c;基于大模型的语言模型在机器翻译任务上取得了显著的进展。这些大模型通常具有数亿甚至数千亿的参数&#xff0c;能够更好地理解和生成自然语言。 但是&#xf…

刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)

找到字符串中所有字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 题目分析&#xff1a; 1.将p里面的字符先丢进一个hash1中&#xff0c;只需要在S字符里面找到多少个和他相同的has…

【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突

文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…

青训营-豆包MarsCode技术训练营试题解析九

介绍 ‌豆包青训营‌是由字节跳动和稀土掘金社区共同发起的技术培训和人才选拔项目&#xff0c;主要面向在校大学生。该项目的目标是培养具有职业竞争力的优秀开发工程师&#xff0c;并提供全程免费的课程&#xff0c;不收取任何费用‌。 课程内容和方向 豆包青训营的课程涵…