Java 基础数据类型占用内存空间和字符串编码简介(二)

news/2024/4/29 3:11:55/文章来源:https://blog.csdn.net/weixin_42176639/article/details/127759689

Java 基础数据类型占用内存空间简介

  • 一 计算机简介
    • 1.基本概念
    • 2.CPU 三级缓存
    • 3.本机参数查看
  • 二 数据占用内存情况
    • 1.多线程Demo
    • 2.结果解析
      • 1.直接计算
      • 2.volatile 计算
      • 3.缓存行填充

一 计算机简介

结合多线程计算机的硬件,从侧面理解数据存储如何影响我们的程序

1.基本概念

1.RAM:随机存储(主存等,断电数据丢失)
2.ROM:只读存储(磁盘等,断点数据保留)
3.BIOS:烧录在主板上ROM内的一段程序(基础输入/输出系统)1.线程:程序或应用的某个功能点,由CPU分配时间片,进行调度
2.进程:完整的运行中的程序或应用,由操作系统进行调度1.单核单线程:一个核心,只能运行一个线程,完全结束后才能开始下一个(串行)
2.单核多线程:一个核心,能调度多个线程,多个线程在某个时间段的不同时间片上运行(并发)
3.多核多线程:多个核心,每个核心至少支持一个线程,至少能有核心数的线程在某个时刻运行(并行)
4.DMA(Direct Memory Access):直接内存控制器,即CPU进行文件复制时,将总线控制权交给DMA,由DMA进行复制,此时CPU能继续进行内部运算或挂起,DMA结束后交还控制权;CPU 与 DMA 还可交替访问内存,此时总线相当于一个换路器。DMA也是我们常说的【零拷贝技术】依赖的硬件基础1.并发:一个计算单元(CPU核心),某一时刻只能运行一个线程,某个时间段多个线程在这个核心内轮询执行就是并发所以并发在本质上调度仍然是串行,只不过每个时间片很短,给我们的感觉是所有程序同时在运行其实,由此可以引出多线程开发设置核心线程数的参考原因:CPU密集型:核心线程数最好与实际核心数一致,CPU密集则尽量使每个线程落在一个核心上,使他们之间发挥并行的效果,核心线程数过大则会在某个核频繁切换上下文(轮询),切换上下文涉及现场保存和恢复等,会消耗性能IO密集型:核心线程数约为实际核心数二倍,由于IO操作的耗时性,当IO等待时,可以让CPU去执行其他线程操作(反正要等待,不如顺便切换几次上下文)
2.并行:多个计算单元(CPU核心),某一个时刻分别运行了一个线程,则这几个线程此刻是并行的

2.CPU 三级缓存

CPU从硬件角度来看,本身设计也是多级缓存的,结构示意如图,而多级缓存的主要目的,和

软件一样,为了提升程序执行和数据访问速度;但是既然是缓存,就涉及到数据一致的问题,

多核CPU下,常见的缓存一致性协议有 MESI

在这里插入图片描述

三级缓存下 ALU 访问资源时间

资源对象周期(可有频率换算)时间(纳秒)
寄存器1 cycle
L1 Cache~3-4 cycles~0.5-1 ns
L2 Cache~10-20 cycles~3-7 ns
L3 Cache~40-45 cycles~15 ns
内存~120-240 cycles~60-120ns

3.本机参数查看

其中逻辑处理器,是基于物理内核虚拟出来的,本机共 4 个内核,虚拟后相当于有 8 个内核

在这里插入图片描述

二 数据占用内存情况

在 Java 里面,使用 volatile 修饰变量时,可能会存在一个伪内存共享问题,我们下面演示一下

volatile 本身有两个作用:可见性、防止指令重排

程序运行时,我们的数据不是一位一位加载的,而是一块一块的,缓存的最小结构是缓存行

,一次填充一个缓存行的数据,这样做也是为了提高处理速度,缓存行大小一般为 64 字节;

volatile 如何保证可见性呢?
当某个线程更新本地缓存中的 value 值后,会使其他线程的本地缓存中的 value 值失效,然后其他线程需要重新去主存取数据,也就保证了可见性
但是由于 value 是存在缓存行内的,每次置失效都要清掉整行数据,重新获取,此时即存在性能损耗

1.多线程Demo

package org.example;import org.openjdk.jol.info.ClassLayout;/*** @author * @date 2022-11-08 22:44* @since 1.8*/
public class CpuCache {public static void main(String[] args) {DemoEntity demo = new DemoEntity();int length = 10000 * 10000;Thread t1 = new Thread(()->{for (int i = 0 ;i < length;i++){demo.a++;}});Thread t2 = new Thread(()->{for (int i = 0 ;i < length;i++){demo.f++;}});long start = System.currentTimeMillis();t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {throw new RuntimeException(e);}long end = System.currentTimeMillis() - start;System.out.println(ClassLayout.parseInstance(demo).toPrintable());System.out.println(String.format("Time:%s Data %s",end,demo));}/*** 测试对象*/static class DemoEntity{private long a;private long f;@Overridepublic String toString(){return String.format("a:%s b:%s",a,f);}}
}

2.结果解析

1.直接计算

线程 1 和 2 都加载了数据时,各自计算,12 毫秒完成了计算

在这里插入图片描述

2.volatile 计算

修改代码,在 DemoEntity 的两个变量前加上 volatile 关键字修饰,重新运行;耗时 2790 毫秒 ?
解析:
上面我们说,数据是加载到缓存行的,我们添加了 volatile 关键字后,两个线程修改同一个对象时,为了保证可见性,会将其他其他缓存行数据清空
线程 1 和 2 的数据大概率加载后会在同一个缓存行,他们互相清空和争抢资源,导致耗时

在这里插入图片描述

3.缓存行填充

原来一个 DemoEntity 对象 32 字节,我们在变量 a 和 f 之间填充两个 long 变量将 线程 2 的数据挤到下一个缓存行
耗时 556 毫秒 

在这里插入图片描述

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

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

相关文章

门面/外观模式

一、门面模式 1、定义 门面模式&#xff08;Facade Pattern&#xff09;又称作外观模式&#xff0c;是指提供一个统一的接口&#xff0c;用来访问子系统中的一群接口&#xff0c;属于结构型设计模式。 门面模式的主要特征是定义了一个高层接口&#xff0c;让子系统更容易使用。…

自然语言处理NLP——ERNIE-M:基于回译机制的“预训练-微调”多语言模型

目录 系列文章目录 一、背景介绍 1.多语言任务 1.1 多语言任务定义 1.2 多语言任务难题 2.多语言模型 2.1 多语言模型定义与原理 2.2 多语言模型困难 3.论文简介 3.1 背景与开发动机 3.2 论文梗概 3.3 论文贡献与成就 二、相关工作 1.预训练方法 1.1 预训练方法…

Tomcat的安装、在idea中的使用以及创建Web项目

目录Tomcat的安装Tomcat运行Tomcat在idea中的使用创建Web项目最后Tomcat的安装 Tomcat的官网: https://tomcat.apache.org/ 从官网上可以下载对应的版本进行使用。 下载windows64位&#xff0c;版本自行选择。 下载好之后找到压缩包进行解压&#xff0c;注意目录不要有中文且…

1. 一些截图方法的比较;2. 将截图直接转换为PDF并拼接,与插入Word后再转换为PDF的对比

1. 一些截图方法的比较 1.1. 有时候当某个软件没有导出功能&#xff0c;或者导出功能受限&#xff0c;比如 tableau public&#xff0c;但又需要获取展示出的可视化信息时&#xff0c;就需要用到截图。如果这些截图还要用在正式文档中&#xff0c;就需要是高清的&#xff0c;至…

[附源码]Python计算机毕业设计SSM篮球馆预约小程序(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

TypeScript(TS)基础内容详细介绍

目录 一、TypeScript概念 二、TypeScript特点 三、开发环境配置 四、初识ts 五、TypeScript类型声明 1、any&#xff1a; 2、number数字类型 3 string字符串类型 4 boolean布尔类型 表示逻辑值&#xff1a;true 和 false。 5 数组类型 6 元组类型 7 enum枚举类型…

Java8 函数式编程【基础篇】

Java 8是Java在保持向后兼容的前提下首次迈出重要一步&#xff0c;相比之前&#xff0c;不再是只对类库的改良&#xff0c;在编写复杂的集合处理、并行化执行、代码简洁度等方面都有颠覆性的提升。本文将探索和理解函数式编程的含义&#xff0c;以及它在Java 8中的实现。 一、…

全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么

全光谱台灯是指灯光色谱丰富度与太阳光一般全面的台灯&#xff0c;这样的灯光照射下的任何物体&#xff0c;不但颜色丰富多彩&#xff0c;而且极其真实&#xff0c;无限接近太阳光下的真实色彩&#xff0c;对人眼舒适度有巨大的提升&#xff0c;所以全光谱台灯不但对孩子无害&a…

【文件I/O】标准IO:库函数

标准IO&#xff1a;库函数一、基本概念1.文件类型2.标准I/O介绍3.流的概念4.文本流和二进制流5.流的缓冲类型6.标准I/O流&#xff08;stdin、stdout、stderr&#xff09;二、标准I/O函数1.fopen、fclose、errrno、strerror、perror&#xff08;打开、关闭文件&#xff0c;输出错…

小程序开发音视频问题汇总及解决方案

目录 问题一&#xff1a;开发音视频&#xff0c;必用的两个小程序组件live-player和live-pusher&#xff0c;他们做什么用的&#xff0c;怎么才能使用&#xff1f; 问题二&#xff1a;一个页面只能插入一个 问题三&#xff1a;真机调试图片预览及视频全屏无反应 问题四&am…

在vue项目中下载swiper出现:Do not use ‘new’ for side effects报错问题

我报错的情况是&#xff1a;我在单文件组件vue文件中使用new Swiper&#xff0c;报了两个错误&#xff0c;图示&#xff1a; 第一个错误是&#xff1a;‘Swiper’ is not defined 第二个错误是&#xff1a;Do not use ‘new’ for side effects 解决办法&#xff1a; &#x…

5G无线技术基础自学系列 | MU-MIMO原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 MU-MIMO是指多个用户在上下行数据传输时…

【Linux】命令

常用命令 帮助&#xff08;Manual Pages&#xff0c;Manual&#xff1a;手册&#xff0c;特指参考文件&#xff09; man man <command_name> 打开目录&#xff08;change directory&#xff09; cd /etc/ cd /home 查看当前所在目录 pwd 创建一个名为 file 的文件&…

[附源码]计算机毕业设计JAVA校园共享单车系统

[附源码]计算机毕业设计JAVA校园共享单车系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

二、【React拓展】懒加载 lazy

文章目录1、适用点2、汇总1、适用点 懒加载往往配合路由一起使用&#xff0c;此处修改的项目是 二、【React-Router5】路由的基本使用 中的项目 首先从react中引入lazy import { lazy } from react 修改引入路由组件的写法 // import About from ./pages/About // import Home…

SequoiaDB湖仓一体分布式数据库2022.11月刊

本月看点速览 产品能力再获认可&#xff0c;入围多个榜单、报告 ‍精彩亮相2022沙丘大会湖仓一体专场 实力吸睛&#xff0c;获多家权威媒体关注与报道 生态圈不断扩大&#xff0c;与6家合作伙伴完成互认证 青杉计划2023进行中&#xff0c;一起攀登更高的“杉” 产品能力再获…

pip 安装 livetest 失败

pip 安装 livetest 失败1. 现象2. 解决方案(1) 下载(2) 移动并解压(3) 修改文件1) livetest-0.5/livetest/__init__.py2) livetest-0.5/setup.py3) livetest-0.5/test/test_select.py(4) 运行安装4. 验证1. 现象 pip 安装 livetest 失败 2. 解决方案 (1) 下载 官网下载 liv…

09-13-Hbase-shell入门操作

09-Hbase-shell入门操作&#xff1a; HBase Shell 操作 DDL基本操作 1&#xff0e;进入 HBase 客户端命令行 [roothadoop102 hbase-1.3.1]# bin/hbase shell 2&#xff0e;查看帮助命令 hbase(main):001:0> help 3&#xff0e;查看当前数据库中有哪些表 hbase(main):0…

网页添加灰色滤镜

网页添加灰色滤镜 b站的灰色滤镜 我校的灰色滤镜 CSDN的灰色滤镜 自己调制css主题,给网页加上滤镜. 更快捷的,可以在可以调制css的浏览器插件中加上滤镜,只要开启插件就会自动修改网站滤镜 以darkreader为例打开其开发者工具 *INVERT .jfk-bubble.gtx-bubble .captcheck_a…

ABAP CLEAR REFRESH FREE 说明(刘欣)

本文仔细测试总结了ABAP中的clear、refresh、free&#xff0c;因为很多时候程序的BUG就是出现在变量没有清理干净&#xff0c;希望整理一个定式出来以后少出BUG。 用clear、refresh、free对带表头的表执行的测试结果如下表&#xff1a; 看起来&#xff0c;最好的避免这些清空命…