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

Java 性能优化:如何在资源受限的环境下实现高效运行?

Java 性能优化:如何在资源受限的环境下实现高效运行?

在计算机系统中,性能优化是一项至关重要的任务,尤其是在资源受限的环境下,如何让 Java 程序高效运行是许多开发者面临的挑战。本文将深入探讨 Java 性能优化的策略和技巧,并通过详细代码实例进行说明。

一、内存管理优化

(一)对象创建优化

  1. 减少不必要的对象创建
    • 在 Java 中,频繁的对象创建会消耗大量的内存和 CPU 资源。尽量重用对象,而不是频繁创建新的对象。
    • 示例代码:
      • 演示不优化和优化后的代码对比,未优化代码频繁创建新的字符串对象,优化代码则利用字符串缓冲区进行拼接。
// 不优化的代码
String result = "";
for (int i = 0; i < 1000; i++) {result += "数字:" + i;
}// 优化后的代码
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {sb.append("数字:").append(i);
}
String result = sb.toString();
  1. 对象池技术
    • 对于一些创建成本较高的对象,可以使用对象池来管理对象的创建和回收。当需要使用对象时,从对象池中获取,使用完毕后归还对象池,而不是直接销毁对象。
    • 示例代码:
      • 创建一个简单的对象池,管理数据库连接对象。通过定义一个连接池类,使用数组或列表存储可用的连接对象,提供获取和归还连接的方法。
public class ConnectionPool {private final Connection[] connections;private int currentIndex = 0;public ConnectionPool(int size) {connections = new Connection[size];for (int i = 0; i < size; i++) {connections[i] = new Connection();}}public synchronized Connection getConnection() {if (currentIndex >= connections.length) {return null; // 池已满}return connections[currentIndex++];}public synchronized void releaseConnection(Connection connection) {for (int i = 0; i < connections.length; i++) {if (connections[i] == connection) {currentIndex = i;break;}}}
}

(二)内存泄漏防范

  1. 及时释放资源
    • 在使用完资源后,要及时释放资源,如文件句柄、数据库连接、网络连接等。避免这些资源一直被占用,导致内存泄漏。
    • 示例代码:
      • 在使用 FileInputStream 读取文件后,及时关闭流。
FileInputStream fis = null;
try {fis = new FileInputStream("example.txt");// 读取文件内容
} catch (IOException e) {e.printStackTrace();
} finally {if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}
}
  1. 避免静态字段持有大对象
    • 静态字段的生命周期与类的生命周期相同,如果静态字段持有大对象,会导致这些对象无法被垃圾回收。尽量避免使用静态字段存储大对象,或者在不再需要时手动设置静态字段为 null。
    • 示例代码:
      • 将一个大对象数组设置为静态字段,演示可能导致内存泄漏的情况,以及如何在适当的时候释放它。
public class MemoryLeakExample {private static Object[] bigObjects;public static void loadBigObjects() {bigObjects = new Object[10000];// 初始化大对象数组}public static void releaseBigObjects() {bigObjects = null;}
}

二、算法优化

(一)时间复杂度优化

  1. 选择高效的算法
    • 不同的算法在处理相同问题时,时间复杂度可能相差很大。尽量选择时间复杂度较低的算法,以提高程序的运行效率。
    • 示例代码:
      • 比较冒泡排序(时间复杂度 O(n²))和快速排序(时间复杂度 O(n log n))的性能差异。
// 冒泡排序
public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交换元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}// 快速排序
public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivotIndex = partition(arr, low, high);quickSort(arr, low, pivotIndex - 1);quickSort(arr, pivotIndex + 1, high);}
}private static int partition(int[] arr, int low, int high) {int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;// 交换元素int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 交换基准元素到正确位置int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;
}
  1. 避免不必要的计算
    • 在循环中,尽量避免重复计算或可以提前计算的表达式。将这些计算移到循环外部,以减少计算次数。
    • 示例代码:
      • 演示在循环中重复计算一个复杂的表达式,以及将表达式计算移到循环外部的情况。
// 不优化的代码
double result = 0.0;
for (int i = 0; i < 1000; i++) {result += Math.sqrt(i) * Math.PI;
}// 优化后的代码
double sqrtPi = Math.sqrt(Math.PI);
for (int i = 0; i < 1000; i++) {result += Math.sqrt(i) * sqrtPi;
}

(二)空间复杂度优化

  1. 使用合适的数据结构
    • 根据实际需求选择合适的数据结构,以减少内存的使用。例如,如果只需要存储一组不重复的元素,可以使用 HashSet 而不是 ArrayList。
    • 示例代码:
      • 比较使用 ArrayList 和 HashSet 存储数据时的内存占用情况。
// 使用 ArrayList
List<String> arrayList = new ArrayList<>();
for (int i = 0; i < 1000; i++) {arrayList.add("Element " + i);
}// 使用 HashSet
Set<String> hashSet = new HashSet<>();
for (int i = 0; i < 1000; i++) {hashSet.add("Element " + i);
}
  1. 原地算法
    • 对于一些可以原地处理的数据,尽量使用原地算法,避免额外的内存分配。原地算法是指在不使用额外内存或只使用少量额外内存的情况下,对数据进行处理的算法。
    • 示例代码:
      • 演示原地反转数组的算法,不需要额外的数组来存储反转后的结果。
public static void reverseArray(int[] arr) {int left = 0;int right = arr.length - 1;while (left < right) {// 交换元素int temp = arr[left];arr[left] = arr[right];arr[right] = temp;left++;right--;}
}

三、并发优化

(一)线程管理优化

  1. 线程池的应用
    • 使用线程池可以有效地控制线程的数量,避免线程过多导致系统资源耗尽。合理配置线程池的参数,如核心线程数、最大线程数、队列大小等,以适应不同的应用场景。
    • 示例代码:
      • 创建一个固定大小的线程池,提交多个任务到线程池中执行。
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {executor.submit(() -> {System.out.println("任务 " + Thread.currentThread().getId() + " 正在运行");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});
}
executor.shutdown();
  1. 避免线程死锁
    • 在多线程环境下,要小心线程死锁的问题。死锁是指两个或多个线程相互等待对方持有的锁,导致线程无法继续执行。可以通过合理的锁获取顺序、使用 tryLock 方法等来避免死锁。
    • 示例代码:
      • 演示一个可能导致死锁的场景,以及如何使用 tryLock 方法来避免死锁。
// 可能导致死锁的代码
Object lock1 = new Object();
Object lock2 = new Object();Thread thread1 = new Thread(() -> {synchronized (lock1) {System.out.println("线程 1 获取了锁 1");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2) {System.out.println("线程 1 获取了锁 2");}}
});Thread thread2 = new Thread(() -> {synchronized (lock2) {System.out.println("线程 2 获取了锁 2");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock1) {System.out.println("线程 2 获取了锁 1");}}
});thread1.start();
thread2.start();// 使用 tryLock 方法避免死锁
ReentrantLock lockA = new ReentrantLock();
ReentrantLock lockB = new ReentrantLock();Thread thread3 = new Thread(() -> {while (true) {boolean gotLockA = false;boolean gotLockB = false;try {gotLockA = lockA.tryLock();Thread.sleep(100);if (gotLockA) {System.out.println("线程 3 获取了锁 A");gotLockB = lockB.tryLock();if (gotLockB) {System.out.println("线程 3 获取了锁 B");// 执行任务}}} catch (InterruptedException e) {e.printStackTrace();} finally {if (gotLockA) {lockA.unlock();}if (gotLockB) {lockB.unlock();}}}
});Thread thread4 = new Thread(() -> {while (true) {boolean gotLockB = false;boolean gotLockA = false;try {gotLockB = lockB.tryLock();Thread.sleep(100);if (gotLockB) {System.out.println("线程 4 获取了锁 B");gotLockA = lockA.tryLock();if (gotLockA) {System.out.println("线程 4 获取了锁 A");// 执行任务}}} catch (InterruptedException e) {e.printStackTrace();} finally {if (gotLockB) {lockB.unlock();}if (gotLockA) {lockA.unlock();}}}
});thread3.start();
thread4.start();

(二)并发数据结构

  1. 使用线程安全的集合
    • Java 提供了许多线程安全的集合类,如 ConcurrentHashMap、CopyOnWriteArrayList 等。在多线程环境下,使用这些线程安全的集合可以避免数据不一致的问题。
    • 示例代码:
      • 演示使用 ConcurrentHashMap 存储和访问数据,与使用普通 HashMap 的区别。
// 使用 ConcurrentHashMap
ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();
for (int i = 0; i < 10; i++) {concurrentMap.put("Key " + i, "Value " + i);
}
String value = concurrentMap.get("Key 5");// 使用 HashMap(不安全的示例,仅用于演示)
Map<String, String> hashMap = new HashMap<>();
for (int i = 0; i < 10; i++) {hashMap.put("Key " + i, "Value " + i);
}
// 在多线程环境下,这可能会导致问题
String valueHashMap = hashMap.get("Key 5");
  1. 原子变量类的使用
    • Java 的原子变量类(如 AtomicInteger、 AtomicLong 等)提供了原子性的读写操作,可以在不使用锁的情况下实现高效的并发操作。
    • 示例代码:
      • 演示使用 AtomicInteger 进行原子性的计数操作,与使用普通 int 变量配合 synchronized 关键字的对比。
// 使用 AtomicInteger
AtomicInteger atomicCount = new AtomicInteger(0);
for (int i = 0; i < 1000; i++) {new Thread(() -> {atomicCount.incrementAndGet();}).start();
}
System.out.println("AtomicInteger 最终值:" + atomicCount.get());// 使用普通 int 变量配合 synchronized
int normalCount = 0;
Object lock = new Object();
for (int i = 0; i < 1000; i++) {new Thread(() -> {synchronized (lock) {normalCount++;}}).start();
}
System.out.println("普通 int 变量最终值:" + normalCount);

四、I/O 操作优化

(一)缓冲 I/O

  1. 使用缓冲流
    • 缓冲流(如 BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter 等)可以减少底层 I/O 操作的次数,提高 I/O 操作的效率。通过内部维护一个缓冲区,将多次小的读写操作合并为一次大的读写操作。
    • 示例代码:
      • 演示使用 FileReader 和 BufferedReader 读取文件的区别,比较读取速度。
// 使用 FileReader(无缓冲)
FileReader fileReader = new FileReader("example.txt");
int c;
long startTime = System.currentTimeMillis();
while ((c = fileReader.read()) != -1) {// 读取字符
}
long endTime = System.currentTimeMillis();
System.out.println("FileReader 读取时间:" + (endTime - startTime) + "ms");
fileReader.close();// 使用 BufferedReader(带缓冲)
BufferedReader bufferedReader = new BufferedReader(new FileReader("example.txt"));
String line;
long startTimeBuffered = System.currentTimeMillis();
while ((line = bufferedReader.readLine()) != null) {// 读取行
}
long endTimeBuffered = System.currentTimeMillis();
System.out.println("BufferedReader 读取时间:" + (endTimeBuffered - startTimeBuffered) + "ms");
bufferedReader.close();
  1. 调整缓冲区大小
    • 根据实际应用场景,可以调整缓冲流的缓冲区大小,以达到最佳的性能。较大的缓冲区可以减少 I/O 操作的次数,但会占用更多的内存。
    • 示例代码:
      • 创建自定义缓冲区大小的缓冲流,演示如何设置缓冲区大小。
// 自定义缓冲区大小的缓冲流
FileInputStream fis = new FileInputStream("example.txt");
BufferedInputStream bis = new BufferedInputStream(fis, 8192); // 设置缓冲区大小为 8KB
int c;
while ((c = bis.read()) != -1) {// 读取字符
}
bis.close();
fis.close();

(二)文件操作优化

  1. 批量读写操作
    • 对于文件的读写操作,尽量采用批量读写的方式,而不是逐个字节或逐行读写。批量读写可以减少系统调用的次数,提高效率。
    • 示例代码:
      • 演示批量写入文件和逐行写入文件的性能差异。
// 逐行写入文件
FileWriter fileWriter = new FileWriter("example.txt");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {fileWriter.write("Line " + i + "\n");
}
long endTime = System.currentTimeMillis();
System.out.println("逐行写入时间:" + (endTime - startTime) + "ms");
fileWriter.close();// 批量写入文件
FileWriter fileWriterBatch = new FileWriter("example_batch.txt");
StringBuffer stringBuffer = new StringBuffer();
long startTimeBatch = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {stringBuffer.append("Line ").append(i).append("\n");
}
fileWriterBatch.write(stringBuffer.toString());
long endTimeBatch = System.currentTimeMillis();
System.out.println("批量写入时间:" + (endTimeBatch - startTimeBatch) + "ms");
fileWriterBatch.close();
  1. 文件压缩与解压缩
    • 对于大数据量的文件传输或存储,可以考虑采用文件压缩技术。压缩文件可以减少文件的大小,从而减少传输时间或存储空间的占用。
    • 示例代码:
      • 演示使用 GZIP 压缩和解压缩文件。
// 压缩文件
FileInputStream fis = new FileInputStream("example.txt");
GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream("example.txt.gz"));
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {gzos.write(buffer, 0, len);
}
gzos.close();
fis.close();// 解压缩文件
GZIPInputStream gzis = new GZIPInputStream(new FileInputStream("example.txt.gz"));
FileOutputStream fos = new FileOutputStream("example_decompressed.txt");
byte[] bufferDecompress = new byte[1024];
int lenDecompress;
while ((lenDecompress = gzis.read(bufferDecompress)) != -1) {fos.write(bufferDecompress, 0, lenDecompress);
}
fos.close();
gzis.close();

五、总结

在资源受限的环境下,Java 性能优化是一个综合性的任务,涉及内存管理、算法优化、并发优化和 I/O 操作优化等多个方面。通过合理地应用上述优化策略和技巧,可以显著提高 Java 程序的性能和效率。在实际开发过程中,需要根据具体的业务场景和性能瓶颈,有针对性地进行优化。

例如,在一个内存受限的系统中,可以重点关注内存管理优化,减少不必要的对象创建,使用对象池技术,及时释放资源,避免内存泄漏。在处理大数据量的计算时,可以选择高效的算法,优化时间复杂度和空间复杂度。在多线程环境下,合理使用线程池,避免线程死锁,使用并发数据结构和原子变量类来提高并发性能。在进行文件读写操作时,采用缓冲 I/O,批量读写操作,以及文件压缩与解压缩技术来优化 I/O 性能。

总之,性能优化是一个持续的过程,需要不断地分析、测试和调整。通过不断地实践和积累经验,我们可以更好地应对各种性能挑战,让 Java 程序在资源受限的环境中也能高效运行。

在这里插入图片描述

相关文章:

Java 性能优化:如何在资源受限的环境下实现高效运行?

Java 性能优化&#xff1a;如何在资源受限的环境下实现高效运行&#xff1f; 在计算机系统中&#xff0c;性能优化是一项至关重要的任务&#xff0c;尤其是在资源受限的环境下&#xff0c;如何让 Java 程序高效运行是许多开发者面临的挑战。本文将深入探讨 Java 性能优化的策略…...

Spring之我见 - Spring MVC重要组件和基本流程

核心组件详解 前端控制器 - DispatcherServlet 作用&#xff1a;所有请求的入口&#xff0c;负责请求分发和协调组件。 public class DispatcherServlet extends HttpServlet {// 核心服务方法protected void doService(HttpServletRequest request, HttpServletResponse re…...

MongoDB常用命令

数据库操作 显示所有数据库 show dbs 切换/创建数据库 (如果数据库不存在则创建) use <database_name> 删除当前数据库 db.dropDatabase() 查看当前数据库 db 查看数据库状态 db.stats() 集合操作 显示当前数据库中的所有集合 show collections 创建集合 d…...

Java Set/List 知识点 Java面试 基础面试题

Java Set/List 知识点 Set与List区别 List 有序、值可重复,内部数据结构 Obejct[ ] 数组Set 无序、值不重复,内部数据结构 HashMap keyobject value固定new Object() ArrayList 有序存储元素允许元素重复&#xff0c;允许存储 null 值支持动态扩容非线程安全 HashSet、LinkedHa…...

C#委托介绍

委托可以将方法作为参数传递&#xff0c;同时委托也可以自己作为参数传递 委托可分为自定义委托delegate 无返回值的Action 与有返回值的Func委托 也有匿名委托与Lamada 委托支持多播是事件的基础 用处如在分线程调用主线程的UI invoke public delegate string Say(stri…...

三网通电玩城平台系统结构与源码工程详解(三):控制台与银商权限模块设计

本篇聚焦于三网通电玩城系统中的控制台管理系统及银商权限逻辑。通过深入解构后台系统的角色分权、账目明细管理、发卡接口与日志追踪机制&#xff0c;本文将提供完整的权限划分方案和部分关键实现代码&#xff0c;为平台运维与数据安全提供坚实基础。 一、控制台整体结构概览 …...

audio 核心服务AudioPolicyService 和AudioFlinger启动流程

目录 1、audioserver启动 2、AudioPolicyService启动 3、AudioFlinger启动 audio的核心服务有两个&#xff0c;AudioPolicyService 和AudioFlinger他们到在audioserver一个进程中 1、audioserver启动 设备开机&#xff0c;系统启动时将执行 /system/etc/init/audioserver.rc…...

Android自动化功能-使用Appium获取android页面节点元素信息

一、appium安装和使用 官方网站&#xff1a;https://appium.io/docs/en/latest/ github地址&#xff1a;https://github.com/appium/appium 安装步骤&#xff1a; 首先需要安装node.js 安装好node.js之后使用npm安装 appium npm install -g appium appium -v # 检查安装版本…...

springboot项目配置springMVC

为什么需要配置springMVC 在Spring Boot中配置Spring MVC&#xff0c;实际上是为了更好地集成和使用Spring框架提供的Web开发功能。 Spring Boot本身是为了简化Spring应用的配置和部署&#xff0c;它内置了一些默认的配置和组件&#xff0c;帮助开发者快速启动应用&#xff0c…...

解决 MongoDB 查询中的 `InvalidMongoDbApiUsageException` 错误

您在使用 Spring Data MongoDB 时遇到了 InvalidMongoDbApiUsageException 异常&#xff0c;错误信息如下&#xff1a; “由于 com.mongodb.BasicDocument 的限制&#xff0c;您无法添加第二个 ‘null’ 条件。查询已经包含 ‘{ “KaTeX parse error: Expected }, got EOF at e…...

多模态知识图谱:重构大模型RAG效能新边界

当前企业级RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统在非结构化数据处理中面临四大核心问题&#xff1a; 数据孤岛效应&#xff1a;异构数据源&#xff08;文档/表格/图像/视频&#xff09;独立存储&#xff0c;缺乏跨模态语义关联&#xff0c;导致知识检…...

基于大模型的贲门失弛缓症手术全流程风险预测与治疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与技术路线 二、贲门失弛缓症概述 2.1 定义与发病机制 2.2 临床表现与诊断标准 2.3 治疗现状与挑战 三、大模型预测原理与数据基础 3.1 大模型介绍与选择依据 3.2 数据收集与预处理 3.3 模型训…...

C语言内存函数

1.memcpy函数 1.1:memcpy函数的介绍 1.2:模拟实现memcpy函数 我实现的memcpy函数无法处理两块重叠的内存的数据的拷贝 #include<assert.h> void* my_memcpy(void* dest, const void* src,size_t num) {assert(dest ! NULL && src ! NULL);//从src指向的内存位…...

Uniapp:navigator(页面跳转)

目录 一、基本概述二、属性说明三、具体使用 一、基本概述 页面跳转。该组件类似HTML中的<a>组件&#xff0c;但只能跳转本地页面。目标页面必须在pages.json中注册。 二、属性说明 属性名类型默认值说明平台差异说明urlString应用内的跳转链接&#xff0c;值为相对路…...

建造者模式详解及其在自动驾驶场景的应用举例(以C++代码实现)

模式定义 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于分步构造复杂对象。该模式将对象构建过程与其表示分离&#xff0c;支持通过相同构建过程生成不同表现形式&#xff0c;特别适合需要灵活配置的自动驾驶车辆系统搭建场景。 自…...

2025年数字媒体设计与文化交流国际会议 (DMACE 2025)

2025 International Conference on Digital Media Art and Cultural Exchange 【一】、大会信息 会议简称&#xff1a;DMACE 2025 大会地点&#xff1a;中国烟台 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 【二】会议…...

【MCP Node.js SDK 全栈进阶指南】利用TypeScript-SDK打造高效MCP应用

前言 在MCP(模型上下文协议)的世界中,SDK(软件开发工具包)是开发者构建应用的重要工具。作为MCP生态中最活跃的SDK之一,TypeScript-SDK提供了简洁而强大的接口,帮助开发者快速构建高效的MCP应用。本文将带你深入了解MCP的TypeScript-SDK,掌握其核心概念和使用方法,让…...

LangChain4j 搭配 Kotlin:以协程、流式交互赋能语言模型开发

Kotlin 支持 | LangChain4j Kotlin 是一种面向 JVM&#xff08;及其他平台&#xff09;的静态类型语言&#xff0c;能够实现简洁优雅的代码&#xff0c;并与 Java 库无缝互操作。 LangChain4j 利用 Kotlin 扩展和类型安全构建器来增强 Java API&#xff0c;为其增添特定于 Ko…...

搜索引擎的高级语法

文章目录 精确搜索&#xff1a;双引号站内搜索&#xff1a;site通配符搜索&#xff1a;*减号缩小范围&#xff1a;-文档搜索&#xff1a;filetypeURL搜索&#xff1a; inurl标题搜索&#xff1a;intitle正文搜索&#xff1a;intext参考链接 精确搜索&#xff1a;双引号 “ ” …...

探秘 SenseGlove Nova 2力反馈手套,解锁 VR 键盘交互新方式

在虚拟现实&#xff08;VR&#xff09;技术不断发展的现今&#xff0c;键盘交互体验的优化成为众多科研人员关注的重点。今天&#xff0c;让我们一同走进 Heilbronn 大学与 SenseGlove 的合作项目&#xff0c;探寻 SenseGlove Nova 2 力反馈手套为 VR 环境中的键盘交互带来的新…...

品牌如何通过朝日新闻出海日本?——某企业日本媒体发稿实战

文 | 言同数字亚太传播实验室 一、日本市场的隐形门槛&#xff1a;中国品牌的三大痛点 案例背景&#xff1a; 某中国灵芝保健品企业&#xff08;代号"ForestLife"&#xff09;&#xff0c;产品虽获中国/欧盟有机认证&#xff0c;但在日本市场面临&#xff1a; 认知…...

安全文件共享实际上是什么样的呢?

通过即时通讯应用共享敏感信息的安全漏洞由来已久&#xff0c;且令人担忧。很少有事件像最近曝光的美国高级政客通过热门即时通讯应用 Signal 泄露军事攻击计划那样引起公众关注。 此类备受瞩目的漏洞凸显了全球各组织迫切需要重新评估其安全交换机密数据的方法。对于许多机密…...

深入探索Spark-Streaming:从基础到核心编程

在大数据实时处理领域&#xff0c;Spark-Streaming凭借其强大功能脱颖而出。它是Spark生态系统中处理流式数据的利器&#xff0c;支持Kafka、Flume等多种数据输入源&#xff0c;能利用Spark的map、reduce等原语处理数据&#xff0c;处理结果可存储于HDFS、数据库等。 Spark-Str…...

深度学习3.6 softmax回归的从零开始实现

本章节引入3.5的数据集 import torch from IPython import display from d2l import torch as d2lbatch_size 256 #迭代器批量 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size)3.6.1 初始化模型参数 num_inputs 784 # 权重矩阵长度 num_outputs 10 # 类别…...

使用Spark-TTS-0.5B模型,文本合成语音

文章目录 背景模型介绍拉取开源代码conda下载与使用项目环境配置修改部分代码文件进阶玩法小结背景 ~~~~ 由于本博主遇到了需要文本转语音的相关需求,经过多方面的调研和研究,市面上的实现这个需求的方法有很多,可以直接通过调取api的方式实现,文本转语音。也可以…...

08前端项目----升序/降序

升序/降序 vue实现升序/降序服务器处理 vue实现升序/降序 用vue实现升序/降序&#xff0c;以及css绘制三角形 <div class"sui-navbar"><div class"navbar-inner filter"><ul class"sui-nav"><li class"active"&g…...

Dataway在Spring Boot中的引入以及使用教程

Dataway是Hasor生态中的接口配置工具&#xff0c;能帮助开发者快速配置数据接口。它支持DataQL和SQL两种语言模式&#xff0c;可将SQL转换为DataQL执行&#xff0c;简化数据查询与交互&#xff0c;无需编写大量代码。接口配置完成后&#xff0c;可进行自测、冒烟测试&#xff0…...

百度搜索 API 相比于爬虫的效率提升、价格及如何注册使用

使用百度搜索 API 进行数据查询&#xff0c;相比于爬虫&#xff08;selenium&#xff09;速度提升的幅度取决于几个因素&#xff1a; 1. 摆脱页面渲染&#xff08;Selenium&#xff09; Selenium 通过控制浏览器来模拟用户行为&#xff0c;加载网页并渲染页面。每次请求都需要…...

Docker 中运行 JAR 文件

文章目录 步骤 1&#xff1a;准备文件结构步骤 2&#xff1a;编写 Dockerfile步骤 3&#xff1a;构建 Docker 镜像步骤 4&#xff1a;运行容器常见问题解决Q1&#xff1a;容器启动后立即退出Q2&#xff1a;时区不一致Q3&#xff1a;依赖外部服务&#xff08;如MySQL&#xff09…...

MacOS 10.15上能跑大语言模型吗?

MacOS 10.15上能跑大语言模型吗&#xff1f; 下载安装Ollama运行大语言模型引申出的问题 MacOS 10.15.7&#xff08;发布于2020年9月&#xff09;作为已经发布了将近5年的系统版本能够运行当今流行的大语言模型吗&#xff1f;这篇文章简要介绍了在MacOS 10.15上通过Ollama运行d…...

分布式之易混淆概念

昨天写UE写的破防了&#xff0c;忘了写文章&#xff0c;今天补一下分布式的一些概念。&#x1f61a; 在软件架构领域&#xff0c;微服务、领域驱动设计&#xff08;DDD&#xff09;和分布式系统是三个高频且容易被混淆的概念。许多开发者误以为它们是“同一件事的不同说法”&a…...

DeepSeek开源引爆AI Agent革命:应用生态迎来“安卓时刻”

开源低成本&#xff1a;AI应用开发进入“全民时代” 2025年初&#xff0c;中国AI领域迎来里程碑事件——DeepSeek开源模型的横空出世&#xff0c;迅速在全球开发者社区掀起热潮。其R1和V3模型以超低API成本&#xff08;仅为GPT-4o的2%-10%&#xff09;和本地化部署能力&#x…...

Anaconda 与 Miniconda 的差异详解

Anaconda 与 Miniconda 的差异详解 Anaconda 和 Miniconda 都是 Python 数据科学领域常用的发行版管理工具&#xff0c;它们都基于 conda 包管理系统&#xff0c;但在设计定位和功能组成上有显著区别。 核心差异对比 特性AnacondaMiniconda安装包大小较大 (3GB)较小 (100MB左…...

STM32 中断系统深度剖析

在嵌入式系统开发领域&#xff0c;STM32 系列微控制器凭借其强大的性能和丰富的资源被广泛应用。中断系统作为 STM32 的关键特性之一&#xff0c;能够极大地提升系统的实时响应能力和多任务处理效率。本文将基于 STM32F4 系列芯片&#xff0c;深入剖析中断与外设中断的原理、配…...

List findIntersection getUnion

List findIntersection & getUnion 求两个列表的交集和并集 package zwf;import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List;/*** 列表工具类* * author ZengWenFeng* date 2025.04.22* mobile 13805029595* email 117791303qq.com*/ p…...

【微服务】SpringBoot制作Docker镜像接入SkyWalking详解

目录 一、前言 二、SkyWalking介绍 2.1 SkyWalking是什么 2.2 SkyWalking核心功能 2.3 SkyWalking整体架构 2.4 SkyWalking主要工作流程 三、前置准备 3.1 搭建SkyWalking服务 3.1.1 下载安装包 3.1.2 上传服务器目录 2.1.3 数据库持久化配置说明 3.1.4 启动skywalk…...

豪越科技消防公车管理系统:智能化保障应急救援效率

近期消防车辆管理暴露出的问题&#xff0c;凸显了传统管理模式的不足。在应急救援任务日益繁重的背景下&#xff0c;消防部门对公车管理提出了更高要求。豪越科技针对消防行业特殊需求&#xff0c;研发了专业的消防公车管理系统&#xff0c;通过"线上提交申请-线上审批-线…...

vscode本地docker gdb调试python

背景 最近在部署测试一个工程&#xff0c;不想配环境&#xff0c;拉官方镜像下来跑的&#xff0c;不幸地是&#xff0c;程序运行有点问题。想要debug一下&#xff0c;又不想在终端gdb&#xff0c;想要在vscode中点点点&#xff0c;所以有了下面的一顿配置。 vscode python常用…...

Electron使用WebAssembly实现CRC-32 原理校验

Electron使用WebAssembly实现CRC-32 原理校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-32 原理格式校验的方式。 CRC-32 原理校验函数WebAssembly源文件 C语言实现C…...

Java求职面试:从Spring Boot到微服务的全面考核

面试场景&#xff1a; 在某互联网大厂的面试室内&#xff0c;面试官严肃地坐在桌子后面&#xff0c;面前是几本厚厚的技术书籍。而我们的主人公&#xff0c;搞笑的水货程序员赵大宝&#xff0c;则带着他标志性的微笑走进了房间。 第一轮提问&#xff1a; 面试官&#xff1a;…...

Electron主进程渲染进程间通信的方式

在 Electron 中&#xff0c;主进程和渲染进程之间的通信主要通过 IPC&#xff08;进程间通信&#xff09;机制实现。以下是几种常见的通信方式&#xff1a; 1. 渲染进程向主进程发送消息&#xff08;单向&#xff09; 渲染进程可以通过 ipcRenderer.send 向主进程发送消息&am…...

Spring Boot 主模块 spring-boot 核心技术解析:从启动类到内嵌容器的无缝支持

在现代企业级应用的开发中&#xff0c;构建高效、简洁的应用框架是至关重要的。Spring Boot 作为 Spring 生态系统的重要一员&#xff0c;凭借其“约定优于配置”的理念&#xff0c;极大简化了传统 Spring 应用的开发过程。通过内嵌的容器支持、自动配置功能以及灵活的外部化配…...

盈达科技GEO解决方案:破解AI时代品牌增长困局

盈达科技GEO解决方案&#xff1a;破解AI时代品牌增长困局 ——全域优化策略助力企业抢占生成式AI流量高地 一、客户痛点&#xff1a;AI重构规则下的三大生存危机 1. 信任危机&#xff1a;AI放大负面杀伤力 财务隐患&#xff1a;上市公司因财报误读导致股价波动 产品质量&…...

安宝特科技 | AR眼镜在安保与安防领域的创新应用及前景

随着科技的不断进步&#xff0c;增强现实&#xff08;AR&#xff09;技术逐渐在多个领域展现出其独特的优势&#xff0c;尤其是在安保和安防方面。AR眼镜凭借其先进的功能&#xff0c;在机场、车站、海关、港口、工厂、园区、消防局和警察局等行业中为安保人员提供了更为高效、…...

蓝牙 6.0 发布,解锁无线科技新可能

在5G和Wi-Fi 7高速发展的时代&#xff0c;蓝牙技术始终以独特优势深度融入日常生活。从无线耳机到智能家居&#xff0c;它凭借低功耗、高兼容的特性&#xff0c;悄然连接各类智能设备&#xff0c;打造无缝的数字生活体验。无论是聆听音乐、智能门禁还是健康监测&#xff0c;蓝牙…...

redis数据类型-地理空间GEO

redis数据类型-地理空间GEO 文档 redis单机安装redis常用的五种数据类型redis数据类型-位图bitmapredis数据类型-基数统计HyperLogLog 说明 官网操作命令指南页面&#xff1a;https://redis.io/docs/latest/commands/?nameget&groupstring 地理空间&#xff1a;GEO …...

2023蓝帽杯初赛内存取证-5

直接查找关键词”xlsx“&#xff0c;但是使用filescna失败了&#xff0c;换成mftparser倒是成功&#xff1a; vol.py -f memdump.mem --profile Win7SP1x64 filescan | grep -E "xlsx" vol.py -f memdump.mem --profile Win7SP1x64 mftparser | grep -E "xlsx&…...

安宝特方案 | 医疗AR眼镜,重新定义远程会诊体验

【AR眼镜&#xff1a;重新定义远程会诊体验】 在快速发展的医疗领域&#xff0c;安宝特医疗AR眼镜以其尖端技术和创新功能&#xff0c;引领远程会诊的未来&#xff0c;致力于为为医生和患者带来更高效、精准和无缝的医疗体验。 探索安宝特医疗AR眼镜如何在医疗行业中引领新风潮…...

RT-Thread学习笔记(三)

RT-Thread学习笔记 时钟管理时钟节拍获取系统节拍定时器系统定时器初始化定时器工作机制动态创建定时器静态创建定时器定时器控制高精度延时函数 时钟管理 操作系统需要通过时间来规范其任务 时钟节拍 任何操作系统都需要提供一个时钟节拍&#xff0c;以供系统处理所有和时间…...

【HTTPS协议原理】数据加密、如何防止中间人攻击、证书和签名、HTTPS完整工作流程

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux网络 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 数据加密常见的加密方式数据摘要方案一&#xff1a;仅使用对称加密方案二&#xff1a;仅使用非对称加密方案三&#xff1a;双…...