当前位置: 首页 > article >正文

秋招Day10 - JVM - 内存管理

JVM组织架构主要有三个部分:类加载器、运行时数据区和字节码执行引擎

  • 类加载器:负责从文件系统、网络或其他来源加载class文件,将class文件中的二进制数据加载到内存中
  • 运行时数据区:运行时的数据存放的区域,分为方法区、堆、虚拟机栈、本地方法栈和程序计数器
  • 字节码执行引擎:用来运行Java字节码,主要包括解释器和JIT编译器

虚拟机栈

Java 虚拟机栈的生命周期与线程相同。

当线程执行一个方法时,会创建一个对应的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息,然后栈帧会被压入虚拟机栈中。当方法执行完毕后,栈帧会从虚拟机栈中移除。

一个空方法如果没有任何变量和参数,局部变量表一定为空吗?

不一定,对于非静态方法,局部变量表中会有一个this引用,指向当前实例;对于静态方法,由于不需要通过this访问实例,所以局部变量表中的变量数量为0(在字节码中体现为locals=0)

本地方法栈

和虚拟机栈类似,但是本地方法栈是为了非Java语言编写的方法(C/C++)服务的,每个栈帧中保存了局部变量表,动态链接,方法出口(没有操作数栈

本地方法栈的运行场景?

当Java应用需要和操作系统底层或硬件进行交互式,需要用到本地方法,比如内存管理,文件操作,系统时间、系统调用

还有JVM自身的一些底层功能也需要用到本地方法,比如过Object里的hashCode(), clone()

native方法

native方法在Java语言中用来修饰本地方法,用来调用非Java语言编写的方法,Java可以通过JNI(Java Native Interface)来和操作系统底层、硬件或本地库进行交互

堆内存

堆中的实例如果不再被任何变量引用,最后会被垃圾收集器回收

方法区

方法区只是一个逻辑概念,并非实际存在。主要存放已被加载的类信息,常量,静态变量。

在JVM的HotSpot实现中,方法区被替换为永久代,但在Java8以后的版本,已经被元空间替代。

JDK 1.6、1.7、1.8内存区域变化

JDK1.6中,方法区的实现是永久代,存放的内容是已被加载的类信息,静态变量(常量)、常量池

JDK1.7中,仍然是永久代,但字符串常量池和静态变量被移动到堆空间中去了,其他信息仍然在永久代中

JDK1.8之后,方法区的实现替换为了元空间(直接内存),并将运行时常量池、类常量池都移动到了元空间。

为什么用元空间替换永久代?

因为永久代使用JVM内存,而元空间使用本地内存。永久代收到JVM内存大小的限制,容易造成内存溢出,而元空间是在直接内存中开辟的,不容易造成内存溢出。其次,永久代的GC触发条件苛刻,回收频率很低

对象创建过程

当使用new创建一个对象时,JVM会首先检查new指令(字节码)的参数(比如说#2)是否能在运行时常量池中的对应索引处找到符号引用(如 "java/lang/String"),然后检查这个符号引用是否经过了类加载,如果没有,就先执行类加载。

如果已经加载,则

  1. 分配内存
  2. 完成对象内存初始化(赋初始值)
  3. 设置对象头(包括类元数据指针,GC年龄分代等信息)
  4. 执行init方法完成赋值操作

对象的销毁过程

如果对象不再被任何强引用所指向,也就是说JVM用可达性算法判断出这个对象无法通过强引用链到达该,就会被GC垃圾回收器销毁,有标记清除、标记复制、标记整理三种回收算法。

堆内存如何分配?

指针碰撞

如果堆内存完美的分为了两部分:已使用和未使用,有一个指针指向了下一个可分配内存位置的起始地址,然后向后移动新对象大小的空间,如果没有发生碰撞(没有超过堆内存边界)原来指针和新指针之间的部分就是为该对象分配的内存

指针碰撞适合没有内存碎片的情况。

空闲列表

Java维护一个列表,列表中记录了还未被使用的空闲的内存块,每个内存块都有大小和地址信息。

当有新对象要分配内存时,JVM会遍历空闲列表找出能够放下新对象的内存块。

如果内存块空间未被完全利用,则会作为一个新的内存块放入空闲列表中。

空闲列表适用于内存碎片化较严重对象大小差异较大的场景如老年代。

new对象时,堆会发生抢占吗?

会。比如用指针碰撞分配内存时:

  • 两个线程同时读取当前指针位置P
  • 线程A计算:P + 50(s的大小)
  • 线程B计算:P + 100(l的大小)
  • 两个线程可能同时更新指针

两个对象被分配到相同或重叠的内存区域

JVM的解决办法是为每个线程预留了一小块内存空间,称为TLAB,用于存放该线程创建的对象。如果TLAB的最大阈值已经不够新对象存放,才会使用全局指针在堆中分配。

// 伪代码流程
if (对象大小 <= TLAB剩余空间) {在TLAB中分配;
} else if (对象大小 > TLAB最大阈值) {直接在堆共享区域分配;
} else {申请新TLAB并在其中分配;
}

对象的内存布局

不同的JVM实现不同,以HotSpot为例:

对象在内存中包括三部分:

  • 对象头:包括类的元数据指针(指向方法、字段信息)和对象标记Mark Word(包括哈希码GC分代年龄信息、锁状态标志、线程持有的锁,偏向锁ID等)
  • 实例数据:也就是对象成员变量的值,JVM可能会对这些数据进行重排/对齐,以提高访问效率
  • 对齐填充:确保是八字节的整数倍,因为CPU一次寻址的指针大小是8字节,正好是L1缓存行的大小,如果不进行对齐,那么可能会导致跨行访问,导致额外的缓存行加载,导致访问效率降低。是一种以空间换时间的方式

类的元数据指针可能被压缩,压缩默认开启,压缩后占4个字节,压缩前占8个字节。

new Object()的对象内存大小是多少?

Object对象没有实例数据,所以占用内存大小为8字节的对象标记Mark Word + 4字节的压缩后的类元数据指针 + 0字节的数组对象专用字段 + 0字节的实例数据 + 4字节的对齐填充 = 16字节

JOL查看内存对象布局

引入依赖:

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.9</version>
</dependency>
public class JOLSample {public static void main(String[] args) {// 打印JVM详细信息(可选)System.out.println(VM.current().details());// 创建Object实例Object obj = new Object();// 打印Object实例的内存布局String layout = ClassLayout.parseInstance(obj).toPrintable();System.out.println(layout);}
}

可以看到有 OFFSET、SIZE、TYPE DESCRIPTION、VALUE 这几个信息。

  • OFFSET:偏移地址,单位字节;
  • SIZE:占用的内存大小,单位字节;
  • TYPE DESCRIPTION:类型描述,其中 object header 为对象头;
  • VALUE:对应内存中当前存储的值,二进制 32 位;

对象的引用大小

Object o = new Object(); 

64位JVM上,未开启压缩指针时,对象的引用大小是8字节;开启压缩指针后,对象的引用大小是4字节。

引用类型的成员变量中,引用存放在该成员变量对象内存的实例数据中

  • 基本类型成员变量 → 直接存储值
  • 引用类型成员变量 → 存储引用(对象地址)

Object o = new Object();大小?

class MyClass {Object o = new Object();  // o引用存储在MyClass对象的实例数据中
}

MyClass对象:
├── 对象头
├── 实例数据
│   └── o引用 (4字节) → 指向Object对象
└── 对齐填充

Object对象:
├── 对象头 (12字节)
├── 实例数据 (0字节)
└── 对齐填充 (4字节)
总计:16字节

总占用:4 + 16 = 20字节

 

JVM如何访问对象?

句柄和直接指针。

句柄

通过一个中间的句柄表来访问对象:

优点是对象移动时只需要改变句柄池中的地址,而不需要改变引用本身的指向。

直接指针访问

引用直接存储的是对象内存的地址,直接通过该对象内存的地址访问到类型信息,实例数据等。

优点是访问速度更快,缺点是如果对象移动需要更新访问地址。

HotSpot默认使用直接指针。

对象有哪几种引用? 

四种,强引用、软引用、弱引用和虚引用

强引用是 Java 中最常见的引用类型。使用 new 关键字赋值的引用就是强引用,只要强引用关联着对象,垃圾收集器就不会回收这部分对象,即使内存不足。

软引用于描述一些非必须对象,通过 SoftReference 类实现。软引用的对象在内存不足时会被回收。 

弱引用用于描述一些短生命周期的非必须对象,如 ThreadLocalMap 中的 Entry,就是通过 WeakReference 类实现的。弱引用的对象会在下一次垃圾回收时会被回收,不论内存是否充足。

虚引用主要用来跟踪对象被垃圾回收的过程,通过 PhantomReference 类实现。虚引用的对象在任何时候都可能被回收。 无法通过虚引用直接获取对象,必须配合ReferenceQueue

Java堆内存分区

分为新生代和老年代两个区域。新生代又分为Eden区,Survivors From和To

新创建的对象都分配在Eden区,当Eden区填满会经历一次Minor GC,存活的对象会被移动到Survivor区。

任何时刻只有一个Survivor区有对象,因为新生代的垃圾收集主要采用标记-复制算法(Eden到Survivor采用简化的复制算法,仅通过引用链追踪),因为新生代的存活对象比较少,每次复制少量的存活对象效率比较高
    •    这个有对象的区叫from区
    •    空的那个区叫to区
    •    每次GC将存活对象从from复制到to
    •    GC完成后,原to变成新from,原from被清空变成新to

如果新生代的对象经过多次GC后仍然存活,会被移动到老年代。

当老年代内存不足时,会触发一次Major GC,对老年代垃圾回收。

对象什么时候进入老年代?

怎么算长期存活? 

JVM维护一个“年龄计数器”,每次新生代中Minor GC未被回收的对象,年龄计数器+1,当年龄超过一个特定阈值(默认15),就会被放入老年代

怎么算大对象?

阈值大小由 JVM 参数 -XX:PretenureSizeThreshold 控制,但在 JDK 8 中,默认值为 0,也就是说默认情况下,对象仅根据 GC 存活的次数来判断是否进入老年代

G1 垃圾收集器中,大对象会直接分配到 HUMONGOUS 区域。当对象大小超过一个 Region 容量的 50% 时,会被认为是大对象。

什么是动态年龄判断? 

如果Survivor区中所有对象的总大小超过了一定比例(通常是50%),那么年龄较小的对象也可能提前进入老年代。

这是因为如果年龄较小的对象在 Survivor 区中占用了较大的空间,会导致 Survivor 区中的对象复制次数增多,影响垃圾回收的效率。

STW

STW是指Stop The World,会暂停所有用户线程的执行。这是为了保证对象引用在移动过程中不会被修改

GC前如何暂停线程?

JVM会使用一个叫做安全点(safe point)的机制确保线程能够安全的被暂停,包括四个步骤:

  1. JVM发出暂停信号
  2. 线程执行到安全点后,自行挂起并等待GC完成
  3. 垃圾回收器完成GC操作
  4. 线程继续执行

什么是安全点?

收到暂停信号后,线程执行到特定位置就暂停执行,挂起自身,这个特定位置叫做安全点,保证线程暂停执行时的数据一致性和状态完整性(引用关系完整可追踪,不会是中间状态)。通常位于方法调用、循环跳转、异常处理等位置。

逃逸

分为方法逃逸和线程逃逸

方法逃逸是指某个对象是否由于返回、复制到全局变量导致逃逸到方法之外,如果逃逸则必须分配到堆中,没有逃逸就进行栈上分配 / 标量替换。

线程逃逸是指某个对象被另一个线程引用,生命周期超出了当前线程,那么该对象也应该分配到堆中。

逃逸分析的好处

  • 降低垃圾回收的压力
  • 线程逃逸分析可以避免对不逃逸的对象加锁,因为变量不会逃逸出线程,不会被其他线程修改
  • 如果对象的字段在方法中独立使用,那么可以进行标量替换,避免对象分配(对象甚至都不会在栈上分配)

 

内存溢出和内存泄漏

内存溢出(OOM)是指程序请求分配内存时没有新的空间了,或者说空间不够了。

内存泄漏是指本应该短期存活的对象没有被及时释放,导致占用的内存无法被使用,久而久之造成内存溢出。

内存泄漏是缺陷,内存溢出是最终结果

手写内存溢出例子

public class HeapSpaceErrorGenerator {public static void main(String[] args) {List<byte[]> list = new ArrayList<>();try {while (true){byte[] bytes = new byte[10 * 1024 * 1024];list.add(bytes);}} catch (OutOfMemoryError e) {System.out.println("OutOfMemoryError 发生在 " + list.size() + " 对象后");throw e;}}
}

每一次的bytes引用都存放到了list中,导致其指向的对象的引用链一直存在,无法被垃圾回收,导致内存泄露

内存泄漏的原因

  • 一旦经过了类加载,静态的集合成员变量的生命周期就和应用程序相同,添加强引用时,其内部的元素都具有强引用链,如果没有主动释放集合中的引用,导致其内部元素无法被垃圾回收,可能导致内存泄漏。
  • 单例模式下对象持有的外部引用无法及时释放;单例对象在整个应用程序的生命周期中存活,如果单例对象持有其他对象的引用且没有主动释放这些引用,这些对象将无法被回收。
  • 数据库、IO、Socket 等连接资源没有及时关闭;
  • ThreadLocalMap的key被清理后,仍然持有value的强引用。在线程执行完后,要调用 ThreadLocal 的 remove 方法进行清理。

处理过内存泄露问题吗?

处理过ThreadLocal 没有及时清理导致出现的内存泄漏问题。

  • jsp -l查看运行的进程id
  • top -p [pid]查看进程的CPU和内存占用情况
  • top -Hp [pid]查看进程下所有线程占用的CPU和内存情况
  • jstack -F [pid] > [pid].txt抓取线程,查看有无死锁、死循环或长时间等待的问题
  • jstat -gcutil [pid] 5000 10每隔 5 秒输出 GC 信息,输出 10 次,查看 YGC 和 Full GC 次数。如果YCG增长缓慢,Full GC快速增长,那就可能存在内存泄露
  • jmap -dump:format=b,file=heap.hprof 10025生成dump文件
  • 使用VisualVM图形化工具装入dump文件,在结果中观察占用内存最多的对象

处理过内存溢出问题吗?

使用jmap -dump命令生成Heap Dump文件,使用工具进行分析,查看内存中对象占用情况

检查是否有未关闭的资源,是否有长生命周期对象

什么情况下会发生栈溢出?

程序调用栈的深度超过JVM的限制时,本质是线程的栈空间不足,无法再为新的栈帧分配内存,最常见的场景是递归调用,递归返回条件设置不当。

相关文章:

秋招Day10 - JVM - 内存管理

JVM组织架构主要有三个部分&#xff1a;类加载器、运行时数据区和字节码执行引擎 类加载器&#xff1a;负责从文件系统、网络或其他来源加载class文件&#xff0c;将class文件中的二进制数据加载到内存中运行时数据区&#xff1a;运行时的数据存放的区域&#xff0c;分为方法区…...

Spring Boot 3.5.0中文文档上线

Spring Boot 3.5.0 中文文档翻译完成&#xff0c;需要的可收藏 传送门&#xff1a;Spring Boot 3.5.0 中文文档...

Redisson学习专栏(一):快速入门及核心API实践

文章目录 前言一、Redisson简介1.1 什么是Redisson&#xff1f;1.2 解决了什么问题&#xff1f; 二、快速入门2.1 环境准备 2.2 基础配置三、核心API解析3.1 分布式锁&#xff08;RLock&#xff09;3.2 分布式集合3.2.1 RMap&#xff08;分布式Map&#xff09;3.2.2 RList&…...

Pandas学习入门一

1.什么是Pandas? Pandas是一个强大的分析结构化数据的工具集&#xff0c;基于NumPy构建&#xff0c;提供了高级数据结构和数据操作工具&#xff0c;它是使Python成为强大而高效的数据分析环境的重要因素之一。 一个强大的分析和操作大型结构化数据集所需的工具集基础是NumPy…...

基于Piecewise Jerk Speed Optimizer的速度规划算法(附ROS C++/Python仿真)

目录 1 时空解耦运动规划2 PJSO速度规划原理2.1 优化变量2.2 代价函数2.3 约束条件2.4 二次规划形式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 时空解耦运动规划 在自主移动系统的运动规划体系中&#xff0c;时空解耦的递进式架构因其高效性与工程可实现性被广泛采用。这一架…...

关于 JavaScript 版本、TypeScript、Vue 的区别说明, PHP 开发者入门 Vue 的具体方案

以下是关于 JavaScript 版本、TypeScript、Vue 的区别说明&#xff0c;以及 PHP 开发者入门 Vue 的具体方案&#xff1a; 一、JavaScript 版本演进 JavaScript 的核心版本以 ECMAScript 规范&#xff08;ES&#xff09; 命名&#xff1a; 版本发布时间关键特性ES52009严格模式…...

中断和信号详解

三种中断 中断分为三种&#xff1a;硬件中断、异常中断、软中断 硬件中断 设备向中断控制器发送中断请求&#xff0c;中断控制器生成对应中断号&#xff0c;然后通过中断引脚向cpu发送高电平&#xff0c;cpu收到请求后不会立即处理&#xff0c;cpu会处理完当前指令&#xff…...

STM32八股【10】-----stm32启动流程

启动流程 1.上电复位 2.系统初始化 3.跳转到 main 函数 启动入口&#xff1a; cpu被清空&#xff0c;程序从0x00000000开始运行0x00000000存放的是reset_handler的入口地址0x00000000的实际位置会变&#xff0c;根据不同的启动模式决定启动模式分为&#xff1a; flash启动&a…...

游戏引擎学习第312天:跨实体手动排序

运行游戏并评估当前状况 目前排序功能基本已经正常&#xff0c;能够实现特定的排序要求&#xff0c;针对单一区域、单个房间的场景&#xff0c;效果基本符合预期。 不过还有一些细节需要调试。现在有些对象的缩放比例不对&#xff0c;导致它们看起来有些怪异&#xff0c;需要…...

智警杯备赛--数据库管理与优化及数据库对象创建与管理

sql操作 插入数据 如果要操作数据表中的数据&#xff0c;首先应该确保表中存在数据。没有插入数据之前的表只是一张空表&#xff0c;需要使用insert语句向表中插入数据。插入数据有4种不同的方式&#xff1a;为所有字段插入数据、为指定字段插入数据、同时插入多条数据以及插…...

MySQL 在 CentOS 7 环境下的安装教程

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习Mysql的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…...

K8S集群主机网络端口不通问题排查

一、环境&#xff1a; k8s: v1.23.6 docker: 20.10.14 问题和故障现象&#xff1a;devops主机集群主机节点到端口8082不通&#xff08;网络策略已经申请&#xff0c;并且网络策略已经实施完毕&#xff09;&#xff0c;而且网络实施人员再次确认&#xff0c;网络策…...

【Elasticsearch】retry_on_conflict

在 Elasticsearch 中&#xff0c;retry_on_conflict 是 _update 和 _update_by_query API 的一个参数&#xff0c;用于处理并发冲突。当多个客户端同时尝试更新同一个文档时&#xff0c;可能会发生版本冲突&#xff08;version conflict&#xff09;。retry_on_conflict 参数允…...

Android Cameara2 + MediaRecorder 完成录像功能

一、打开相机、预览 打开相机预览流程是Camera2的默认流程 可参考&#xff1a;https://blog.csdn.net/kk3087961/article/details/135616576 二、开启录像功能 开启录像主要包括以下3步&#xff1a; private void startRecording() {// 1. 停止预览并关闭会话if (mCameraSes…...

python打卡day39

知识点回顾 图像数据的格式&#xff1a;灰度和彩色数据模型的定义显存占用的4种地方 模型参数梯度参数优化器参数数据批量所占显存神经元输出中间状态 batchisize和训练的关系 课程代码&#xff1a; # 先继续之前的代码 import torch import torch.nn as nn import torch.opti…...

3.8.5 利用RDD统计网站每月访问量

本项目旨在利用Spark RDD统计网站每月访问量。首先&#xff0c;创建名为“SparkRDDWebsiteTraffic”的Maven项目&#xff0c;并添加Spark和Scala的依赖。接着&#xff0c;编写Scala代码&#xff0c;通过SparkContext读取存储在HDFS上的原始数据文件&#xff0c;使用map和reduce…...

尚硅谷redis7 49-51 redis管道之理论简介

前提redis事务和redis管道有点像&#xff0c;但本质上截然不同 49 redis管道之理论简介 面试题 如何优化频繁命令往返造成的性能瓶颈&#xff1f; redis每秒可以承受8万的写操作和接近10万次以上的读操作。每条命令都发送、处理、返回&#xff0c;能不能批处理一次性搞定呢…...

Spring Boot + MyBatis-Plus实现操作日志记录

创建数据库表 CREATE TABLE sys_operation_log (log_id bigint NOT NULL AUTO_INCREMENT COMMENT 日志ID,operation_type varchar(20) NOT NULL COMMENT 操作类型,operation_module varchar(50) NOT NULL COMMENT 操作模块,operation_desc varchar(200) DEFAULT NULL COMMENT …...

JavaScript入门基础篇-day03

一、为什么需要数组&#xff1f; 在我们正式学习数组之前&#xff0c;先思考一个场景&#xff1a;假设我们要记录一个班级50位同学的期末成绩。如果不用数组&#xff0c;代码会是这样的&#xff1a; let score1 85; let score2 92; let score3 78; // ... 要写50个变量&am…...

Leetcode-5 好数对的数目

Leetcode-5 好数对的数目&#xff08;简单&#xff09; 题目描述思路分析通过代码&#xff08;python&#xff09; 题目描述 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] nums[j] 且 i < j &#xff0c;就可以认为这是一组 好数对 。 返回好数对的数目。 示…...

openEuler安装MySql8(tar包模式)

操作系统版本&#xff1a; openEuler release 22.03 (LTS-SP4) MySql版本&#xff1a; 下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 准备安装&#xff1a; 关闭防火墙&#xff1a; 停止防火墙 #systemctl stop firewalld.service 关闭防火墙 #systemc…...

Opencv实用操作6 开运算 闭运算 梯度运算 礼帽 黑帽

1.相关函数 开运算 img_open cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#&#xff08;图片&#xff0c;算法&#xff0c;核&#xff09; 闭运算 img_close cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#&#xff08;图片&#xff0c;算法&#xff0c;核&#xff09; 梯度…...

基于python,html,flask,echart,ids/ips,VMware,mysql,在线sdn防御ddos系统

详细视频:【基于python,html,flask,echart,ids/ips,VMware,mysql,在线sdn防御ddos系统-哔哩哔哩】 https://b23.tv/azUqQXe...

Git:现代软件开发的基石——原理、实践与行业智慧·优雅草卓伊凡

Git&#xff1a;现代软件开发的基石——原理、实践与行业智慧优雅草卓伊凡 一、Git的本质与核心原理 1. 技术定义 Git是一个分布式版本控制系统&#xff08;DVCS&#xff09;&#xff0c;由Linus Torvalds在2005年为管理Linux内核开发而创建。其核心是通过快照&#xff08;Sna…...

NLua性能对比:C#注册函数 vs 纯Lua实现

引言 在NLua开发中&#xff0c;我们常面临一个重要选择&#xff1a;将C#函数注册到Lua环境调用&#xff0c;还是直接在Lua中实现逻辑&#xff1f; 直觉告诉我们&#xff0c;C#作为编译型语言性能更高&#xff0c;但跨语言调用的开销是否会影响整体性能&#xff1f;本文通过基准…...

【计算机网络】第2章:应用层—Web and HTTP

目录 一、Web 与 HTTP 二、总结 &#xff08;一&#xff09;Web 的定义与功能 &#xff08;二&#xff09;HTTP 协议的定义与功能 &#xff08;三&#xff09;HTTP 协议的核心机制 1. HTTP 请求与响应流程 2. HTTP 的连接类型 3. HTTP 的状态码 &#xff08;四&#xf…...

HarmonyOS 5 应用开发导读:从入门到实践

一、HarmonyOS 5 概述 HarmonyOS 5 是华为推出的新一代分布式操作系统&#xff0c;其核心设计理念是"一次开发&#xff0c;多端部署"。与传统的移动操作系统不同&#xff0c;HarmonyOS 5 提供了更强大的跨设备协同能力&#xff0c;支持手机、平板、智能穿戴、智慧屏…...

大数据治理:分析中的数据安全

引言 随着大数据技术在各行业的深度应用&#xff0c;海量数据蕴含的价值被不断挖掘。然而&#xff0c;数据规模的爆发式增长与分析场景的复杂化&#xff0c;使数据安全问题日益凸显。从数据泄露、隐私侵犯到非法访问&#xff0c;每一个安全漏洞都可能带来难以估量的损失。本文将…...

数字孪生技术赋能西门子安贝格工厂:全球智能制造标杆的数字化重构实践

在工业4.0浪潮席卷全球制造业的当下&#xff0c;西门子安贝格电子制造工厂&#xff08;Electronic Works Amberg, EWA&#xff09;凭借数字孪生技术的深度应用&#xff0c;构建起全球制造业数字化转型的典范。这座位于德国巴伐利亚州的“未来工厂”&#xff0c;通过虚实融合的数…...

国内高频混压PCB厂家有哪些?

一、技术领先型厂商&#xff08;聚焦材料与工艺突破&#xff09; 猎板PCB 技术亮点&#xff1a;真空层压工艺实现FR-4与罗杰斯高频材料&#xff08;RO4350B/RO3003&#xff09;混压&#xff0c;阻抗公差3%&#xff0c;支持64单元/板的5G天线模块&#xff0c;插损降低15%。 应用…...