Java内存管理与性能优化实践
Java内存管理与性能优化实践
Java作为一种广泛使用的编程语言,其内存管理和性能优化是开发者在日常工作中需要深入了解的重要内容。Java的内存管理机制借助于垃圾回收(GC)来自动处理内存的分配和释放,但要实现高效的内存管理和优化性能,开发者仍然需要深入理解Java的内存模型、垃圾回收机制以及常见的性能瓶颈。
本文将详细探讨Java内存管理的基本原理,并通过实际的性能优化实践,帮助开发者在开发过程中提升应用的效率。
1. Java内存管理基础
Java的内存管理机制可以归纳为几个关键组件,分别是堆内存、栈内存、方法区(包括类加载器和JVM内部的常量池)等。理解这些组件的内存分配和回收机制,对于开发高效的Java应用至关重要。
1.1 堆内存与栈内存
Java中的内存分为两大主要区域:堆(Heap)和栈(Stack)。这两个区域分别承担不同的功能:
- 堆内存:用于存储对象及其属性,堆内存是Java内存管理的核心区域,垃圾回收器主要对堆内存进行管理。
- 栈内存:用于存储局部变量和方法调用的栈帧。栈内存是线程私有的,每个线程都会有自己的栈空间。
1.2 Java的垃圾回收机制
Java的垃圾回收(GC)是自动管理内存的核心机制。GC主要通过标记-清除、复制、标记-整理等算法来回收无用的对象,避免内存泄漏。
- 标记-清除算法:标记所有可达对象,然后清除未标记的对象。
- 复制算法:将内存分为两个区域,每次只使用一个区域,回收时将存活的对象复制到另一区域。
- 标记-整理算法:与标记-清除相似,但在清理后进行整理,减少内存碎片。
在JVM中,GC的实现是分代进行的,堆内存被划分为新生代、老年代和永久代(在JVM 8以后,永久代被元空间替代)。
2. 性能优化策略
在开发Java应用时,性能优化往往依赖于对内存的合理管理和垃圾回收机制的理解。以下是几种常见的优化策略:
2.1 减少GC频率和停顿时间
垃圾回收频率和停顿时间是影响应用性能的关键因素。频繁的GC会增加系统的负担,导致性能下降。为了减少GC的影响,可以采取以下措施:
- 对象池化:通过对象池技术,复用对象而非频繁创建和销毁对象,减少GC的压力。
- 手动管理内存:尽量避免创建过多的临时对象,特别是在循环中。
- 合理设置JVM参数:通过调整JVM的堆内存大小、GC类型等来优化垃圾回收的效率。
示例:调整JVM参数
在启动应用时,可以通过以下JVM参数调整垃圾回收的行为:
java -Xms1024m -Xmx2048m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar myapp.jar
-Xms1024m:设置JVM初始堆内存为1024MB。-Xmx2048m:设置JVM最大堆内存为2048MB。-XX:+UseG1GC:启用G1垃圾回收器。-XX:MaxGCPauseMillis=200:设置最大GC暂停时间为200毫秒。
2.2 内存泄漏的检测与防止
内存泄漏是指程序无法释放不再使用的对象,导致内存消耗逐渐增加。常见的内存泄漏原因包括:
- 静态集合类:静态集合类持有大量对象,且没有及时清理,可能导致内存泄漏。
- 事件监听器未移除:对象注册了事件监听器,但在不再需要时没有移除,导致对象无法被GC回收。
- 内存泄漏检测工具:可以使用工具如VisualVM、JProfiler、MAT(Memory Analyzer Tool)来分析内存泄漏。
示例:防止静态集合类导致内存泄漏
public class Cache {private static Map<String, Object> cache = new HashMap<>();public static void put(String key, Object value) {cache.put(key, value);}public static Object get(String key) {return cache.get(key);}public static void remove(String key) {cache.remove(key);}
}
上述代码中,cache是一个静态字段,它会导致缓存数据无法被GC回收。如果没有显式地调用remove方法移除缓存中的对象,就可能造成内存泄漏。使用WeakHashMap代替HashMap可以防止内存泄漏。
2.3 优化堆内存分配
合理分配堆内存大小对于提高Java应用的性能至关重要。堆内存过大或过小都可能导致性能问题。
- 过大:JVM会使用更多的内存,GC暂停时间增加,且可能会频繁发生Full GC。
- 过小:频繁进行Young GC,导致响应时间变慢。
通过合理设置JVM参数,进行堆内存的调优:
java -Xms512m -Xmx2048m -XX:+UseG1GC -XX:NewSize=512m -jar myapp.jar
-Xms512m:设置初始堆内存为512MB。-Xmx2048m:设置最大堆内存为2048MB。-XX:NewSize=512m:设置新生代大小为512MB。
2.4 使用合适的数据结构
选择合适的数据结构对内存的使用和程序的执行效率有重要影响。例如,使用ArrayList替代LinkedList来减少内存消耗和提高访问速度,使用HashMap替代TreeMap来提高查找效率等。
示例:优化内存使用
// 使用ArrayList代替LinkedList来减少内存消耗
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {list.add(i);
}// 使用HashMap代替TreeMap来提高查找效率
Map<Integer, String> map = new HashMap<>();
for (int i = 0; i < 1000; i++) {map.put(i, "value" + i);
}
通过选择适合的集合类,可以减少内存占用并提高程序的性能。
2.5 JVM性能调优工具
在Java应用中进行性能优化时,合理使用JVM调优工具是必不可少的。以下是几款常用的JVM性能分析工具:
- jvisualvm:用于监控JVM的性能、内存使用情况和线程活动。
- jprofiler:强大的性能分析工具,可以用于分析内存泄漏、CPU性能瓶颈等问题。
- MAT(Memory Analyzer Tool):用于分析堆转储文件,检测内存泄漏。
3. 实践案例:优化一个Java Web应用
假设我们有一个Java Web应用,需要对其进行内存管理和性能优化。以下是优化步骤:
- 分析GC日志:启用GC日志,查看GC频率和停顿时间。
java -Xlog:gc* -jar mywebapp.jar
- 调整堆内存参数:根据GC日志分析结果,调整堆内存的初始和最大值。
java -Xms1024m -Xmx2048m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar mywebapp.jar
- 优化数据库连接池:确保数据库连接池大小适中,避免过多连接占用内存。
- 减少对象创建:避免在频繁调用的方法中创建临时对象,使用对象池技术重用对象。
- 内存泄漏检查:使用VisualVM检查内存泄漏,识别并修复静态集合类和事件监听器问题。
4. 实践案例:优化一个Java Web应用
假设我们有一个Java Web应用,该应用在高并发情况下表现出内存不足和响应缓慢的现象。我们将通过以下几个步骤来优化内存管理与性能,提升系统的稳定性和响应速度。
4.1 启用并分析GC日志
GC日志能够帮助我们了解垃圾回收的行为及其对应用性能的影响。通过分析GC日志,可以确定GC发生的频率、停顿时间和堆内存使用情况,从而优化堆大小及GC策略。
首先,启用GC日志:
java -Xlog:gc* -jar mywebapp.jar
通过查看GC日志,分析以下几个关键数据点:
- GC频率:频繁的Full GC可能意味着堆内存设置过小,或者有大量的临时对象产生。
- GC停顿时间:如果GC停顿时间过长,可能导致应用响应延迟。可以通过调整JVM参数(如
-XX:MaxGCPauseMillis)来优化停顿时间。 - 堆内存使用情况:GC日志能够帮助我们分析堆内存是否已充分利用,并决定是否需要调整堆内存的大小。
4.2 调整堆内存参数
通过GC日志的分析结果,我们可以决定堆内存的初始大小和最大值。在我们的案例中,我们通过调整堆内存来减少GC的频率和停顿时间。
假设GC日志显示频繁发生Full GC,且堆内存大小较小,可以将堆内存的初始大小(-Xms)和最大大小(-Xmx)增加,并使用G1垃圾回收器以减少停顿时间。
java -Xms2048m -Xmx4096m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar mywebapp.jar
-Xms2048m:设置JVM初始堆内存为2048MB。-Xmx4096m:设置JVM最大堆内存为4096MB。-XX:+UseG1GC:启用G1垃圾回收器,它在低延迟和高吞吐量之间做出平衡。-XX:MaxGCPauseMillis=200:将GC停顿时间限制为200毫秒以内,帮助提高应用的响应性。
4.3 优化数据库连接池
数据库连接池是一个常见的性能瓶颈。在Web应用中,数据库连接的创建和销毁会耗费大量的资源。合理配置数据库连接池,可以减少连接的开销,提升数据库访问性能。
我们可以使用常见的数据库连接池库,如HikariCP、C3P0等。下面是使用HikariCP配置数据库连接池的示例:
<!-- 在application.properties中配置HikariCP -->
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=600000
minimum-idle:池中最小的空闲连接数。设置为10意味着即使连接池中没有请求,连接池也会保持10个连接空闲。maximum-pool-size:连接池的最大连接数,设置为50意味着最多可以有50个数据库连接同时处于活动状态。idle-timeout:连接在池中空闲时的最大时间,超过该时间会被回收。max-lifetime:连接的最大生命周期,超过该时间会被关闭并重新创建。
通过适当配置数据库连接池,可以有效减少数据库连接的创建与销毁开销,提高数据库访问效率,进而提升整体应用性能。
4.4 减少临时对象的创建
在Java中,频繁地创建临时对象会增加GC的负担,导致内存占用过高。为了减少GC的频繁触发,我们需要尽量避免在循环或高频调用的方法中创建临时对象。
示例:优化循环中的对象创建
// 不优化的代码:每次循环都创建一个新的String对象
for (int i = 0; i < 1000; i++) {String result = "Item " + i;process(result);
}// 优化后的代码:避免在循环中频繁创建对象
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {sb.setLength(0); // 清空缓存区sb.append("Item ").append(i);process(sb.toString());
}
在优化后的代码中,我们避免在每次循环时创建新的String对象,而是重用StringBuilder来构造字符串。这种优化减少了对象的创建和GC的负担。
4.5 监控并优化线程池
高并发应用中,线程池的使用至关重要。合理配置线程池的大小可以避免线程的频繁创建与销毁,减少系统资源的消耗,同时避免线程饥饿(线程数过少)或线程阻塞(线程数过多)。
我们可以使用Executors来创建线程池,并根据业务需求设置合理的线程池参数:
// 使用ThreadPoolExecutor创建自定义线程池
int corePoolSize = 10;
int maxPoolSize = 50;
long keepAliveTime = 60L;
TimeUnit unit = TimeUnit.SECONDS;ExecutorService executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<>()
);// 提交任务
executor.submit(() -> {// 执行任务
});
corePoolSize:核心池大小,线程池中始终保持的线程数。maxPoolSize:最大线程数,线程池能够容纳的最大线程数。keepAliveTime:当线程池中的线程空闲时,保持的最大时间。
通过合理配置线程池的大小,可以提高线程的复用性,减少线程创建和销毁的开销,从而提升应用的性能。
4.6 内存泄漏的检查与修复
内存泄漏是影响Java应用性能的常见问题,尤其是在高并发和长时间运行的应用中。Java内存泄漏通常发生在对象未能及时释放,导致它们一直占用内存空间。
使用VisualVM等工具可以帮助我们监测应用的内存使用情况并定位内存泄漏。
-
常见的内存泄漏原因
:
- 静态集合类持有大量对象,未能及时清理。
- 事件监听器未解除注册。
- 使用不当的第三方库,导致对象引用未被释放。
示例:检测内存泄漏
// 内存泄漏示例:静态集合类导致的内存泄漏
public class Cache {private static Map<String, Object> cache = new HashMap<>();public static void addToCache(String key, Object value) {cache.put(key, value);}public static Object getFromCache(String key) {return cache.get(key);}
}
在上述代码中,Cache类的cache是一个静态成员,它会一直持有对添加到缓存中的对象的引用。如果不定期清理这些对象,cache将不断增长,最终导致内存泄漏。
为了解决这个问题,可以使用WeakHashMap来代替HashMap,从而使得缓存中的对象能够在没有强引用时被GC回收:
public class Cache {private static Map<String, Object> cache = new WeakHashMap<>();public static void addToCache(String key, Object value) {cache.put(key, value);}public static Object getFromCache(String key) {return cache.get(key);}
}
WeakHashMap中的对象在没有强引用时会被GC回收,从而避免了内存泄漏问题。
5. 高效的垃圾回收调优
随着应用的复杂度增加,垃圾回收的调优变得尤为重要。通过选择合适的垃圾回收策略,可以有效降低GC的开销,提高应用的性能。
常用的垃圾回收器有:
- Serial GC:适用于单核机器或内存较小的系统,适用于小型应用。
- Parallel GC:适用于多核机器,能够充分利用CPU资源,适合处理高吞吐量任务。
- G1 GC:适用于大内存、高并发的系统,能够提供较低的GC停顿时间和较好的吞吐量。
- ZGC(Z Garbage Collector)和Shenandoah GC:低延迟的垃圾回收器,适用于需要响应时间低的应用。
可以根据实际需求选择适合的GC策略,并通过-XX:+PrintGCDetails来打印GC日志,以便进一步分析和优化。
6. JVM性能监控与调优工具
在Java应用的性能优化过程中,JVM性能监控和调优工具是不可或缺的,它们可以帮助开发者深入分析内存使用、GC行为、线程活动等,从而找出性能瓶颈并进行有效的优化。
6.1 使用JVM工具分析GC和内存
VisualVM
VisualVM是JVM的一种图形化监控工具,能够帮助开发者查看JVM的运行状态,包括内存、线程、垃圾回收等信息。它可以连接到正在运行的JVM进程,并提供如下功能:
- 内存分析:查看堆内存使用情况,帮助发现内存泄漏。
- CPU分析:查看CPU使用率,识别CPU占用高的线程。
- 线程分析:查看线程的状态和活动,帮助找出阻塞的线程。
启动VisualVM并连接到JVM后,可以通过以下步骤分析GC和内存:
- 监控堆内存:点击
Heap Dump,分析堆内存使用情况和对象分布。 - GC监控:通过
GC选项查看垃圾回收日志,分析GC频率和停顿时间。 - 查看线程状态:在
Threads标签页中查看当前线程状态,定位线程饥饿和死锁问题。
jstat
jstat是JVM自带的一个命令行工具,主要用于监控JVM的性能指标,如垃圾回收情况、堆内存使用等。它可以实时输出堆内存、垃圾回收统计数据,帮助开发者了解JVM的运行状态。
例如,使用以下命令来监控GC信息:
jstat -gcutil <pid> 1000
<pid>:JVM进程的ID。1000:表示每秒输出一次统计信息。
这将输出类似以下信息:
S0C S1C S0U S1U EC EU OC OU YGC YGCT FGC FGCT GCT1024.0 1024.0 0.0 0.0 8192.0 500.0 4096.0 1024.0 10 0.005 2 0.05 0.055
这些数据显示了不同内存区域的使用情况,帮助我们分析GC的频率和堆的使用情况。
6.2 使用JProfiler进行深度分析
JProfiler是一款强大的Java性能分析工具,专门用于分析内存、CPU、线程等性能瓶颈。它提供了对堆内存使用、内存泄漏、CPU消耗等方面的详细分析,适合用来做深度性能优化。
内存分析
JProfiler可以通过堆转储分析来帮助我们定位内存泄漏。它允许开发者:
- 查看对象分配:分析哪些类的对象最占用内存。
- 查看对象引用链:跟踪对象的引用路径,找出导致内存泄漏的根本原因。
- 堆转储:导出堆转储文件进行后期分析。
CPU分析
通过JProfiler的CPU分析功能,可以深入查看应用中哪些方法调用最占用CPU。它提供了详细的堆栈跟踪信息,帮助定位性能瓶颈。
分析线程
JProfiler还能够监控线程的活动,分析线程的生命周期和阻塞情况,找出潜在的线程问题,如死锁和线程饥饿。
6.3 使用Prometheus和Grafana进行JVM监控
Prometheus和Grafana是现代分布式应用监控的标配工具,特别适用于监控Java微服务和高并发应用。我们可以通过jmx_exporter将JVM指标暴露给Prometheus,然后使用Grafana可视化这些指标。
配置Prometheus与JMX Exporter
首先,下载并配置jmx_exporter,将JVM指标暴露到Prometheus:
java -javaagent:/path/to/jmx_exporter.jar=9404:/path/to/jmx_exporter_config.yaml -jar myapp.jar
9404是暴露JVM指标的端口。jmx_exporter_config.yaml是JMX Exporter的配置文件。
然后,通过Prometheus拉取JVM指标,配置Prometheus与Grafana来展示这些数据,例如:
scrape_configs:- job_name: 'java'static_configs:- targets: ['localhost:9404']
通过Grafana的Dashboard,可以直观地看到内存使用情况、垃圾回收时间、线程活动等指标。
7. 高效的垃圾回收调优
垃圾回收(GC)是JVM性能优化的关键之一,GC的调优可以显著减少应用的响应时间,提升系统的吞吐量。以下是几个常见的垃圾回收调优方法:
7.1 选择合适的垃圾回收器
JVM提供了多种垃圾回收器,每种回收器适用于不同的场景。选择合适的垃圾回收器可以提高GC效率,减少GC停顿时间。
- Serial GC:适合单核机器或内存较小的应用,优点是实现简单,缺点是并发性能差。
- Parallel GC:适用于多核机器,能够提供更好的吞吐量,适用于批处理或非实时应用。
- G1 GC:适用于大内存、低延迟的应用,能够控制GC停顿时间,适合需要高响应的应用。
- ZGC/Shenandoah:新一代低延迟垃圾回收器,适用于对响应时间要求极高的应用。
可以通过JVM启动参数选择适合的垃圾回收器,例如:
java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar myapp.jar
7.2 调整GC暂停时间
JVM的GC停顿时间会直接影响应用的响应时间,特别是在高并发和大内存应用中。通过调整MaxGCPauseMillis和G1HeapRegionSize等参数,可以控制GC的停顿时间。
- MaxGCPauseMillis:设置最大GC停顿时间,JVM会尽力在此时间内完成GC,适用于低延迟要求的应用。
- G1HeapRegionSize:调整G1 GC区域的大小,优化GC的内存分配。
java -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1HeapRegionSize=8m -jar myapp.jar
通过这些参数的调整,可以实现较低的GC停顿时间,保证系统的响应能力。
7.3 调整堆内存大小
堆内存的大小直接影响GC的效率。较小的堆内存可能导致频繁的GC,较大的堆内存可能导致Full GC时的长时间停顿。我们需要根据应用的内存需求来调整堆内存的大小。
通过以下参数可以设置堆内存的初始大小和最大大小:
java -Xms1024m -Xmx2048m -XX:+UseG1GC -jar myapp.jar
-Xms1024m:设置初始堆内存为1024MB。-Xmx2048m:设置最大堆内存为2048MB。
通过调整堆的大小,可以避免频繁的Young GC和Full GC,从而提升应用性能。
8. 使用JVM日志分析工具
JVM日志分析工具能够帮助开发者深入了解JVM的运行情况,特别是在GC调优和内存管理方面。
8.1 GC日志分析
GC日志记录了垃圾回收的详细信息,包括GC的类型、停顿时间、堆内存的使用情况等。使用GC日志分析工具,如GCViewer、JClarity等,可以帮助我们识别性能瓶颈。
启用GC日志
使用以下JVM参数启用GC日志:
java -Xlog:gc* -jar myapp.jar
通过GC日志,我们可以分析出GC频率、停顿时间、堆内存使用等指标,从而进行优化。
总结
Java内存管理与性能优化是确保高效、可扩展应用的关键因素。本文深入探讨了Java内存管理的核心概念、常见的内存优化策略,以及通过具体实践案例如何提升应用性能。以下是本篇文章的主要内容总结:
- 内存管理基础:
- 堆内存与非堆内存:了解堆内存、方法区、直接内存等内存区域的分配与使用。
- 垃圾回收(GC)机制:分析GC的工作原理,及其对应用性能的影响。
- 性能优化实践:
- 通过启用GC日志和分析堆内存使用情况,合理调整堆大小,选择适合的垃圾回收器来减少停顿时间。
- 优化数据库连接池、线程池等资源的配置,以提高应用的吞吐量和响应速度。
- 避免频繁的对象创建,通过重用对象和使用合适的数据结构,减少内存消耗和GC的负担。
- 监控与分析工具:
- VisualVM、JProfiler、Prometheus与Grafana等工具可以帮助开发者实时监控JVM的内存使用、GC行为、线程活动等,提供深入的性能分析。
- GC日志分析工具(如GCViewer、JClarity)能够帮助开发者识别GC瓶颈并优化GC策略。
- 垃圾回收调优:
- 选择适合的垃圾回收器(如G1、ZGC等)根据应用需求调整GC策略,以减少GC停顿时间并优化内存利用。
- 调整堆内存大小,控制GC的频率与停顿时间,避免Full GC和过度的内存消耗。
- 内存泄漏的监控与修复:
- 使用堆转储分析工具,如VisualVM、JProfiler等,检测内存泄漏的根本原因,并通过改进代码结构(如使用
WeakHashMap)来避免内存泄漏问题。
- 使用堆转储分析工具,如VisualVM、JProfiler等,检测内存泄漏的根本原因,并通过改进代码结构(如使用
通过对JVM内存管理和性能优化的深入理解及实践,开发者可以有效地提升应用性能,避免内存瓶颈和GC问题,从而确保Java应用的高效运行。

相关文章:
Java内存管理与性能优化实践
Java内存管理与性能优化实践 Java作为一种广泛使用的编程语言,其内存管理和性能优化是开发者在日常工作中需要深入了解的重要内容。Java的内存管理机制借助于垃圾回收(GC)来自动处理内存的分配和释放,但要实现高效的内存管理和优…...
unsloth报错FileNotFoundError: [WinError 3] 系统找不到指定的路径。
运行平台 Windows 报错信息 Traceback (most recent call last): File “C:\Python312\Lib\site-packages\IPython\core\interactiveshell.py”, line 3577, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File “”, line 1, in runfile(‘D:\python_pr…...
不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比
本文深入探讨了最近国内外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技术细节、性能表现、应用场景及局限性,并从技术能力、功能需求、成本预算、数据安全和合规以及服务与支持五个关键维度,详细分析了不同规模企业在选择 AI 工具时的考量因素…...
各章节详细总结与 Vue 学习收尾
各章节详细总结与 Vue学习收尾 第一章:基础入门 通俗理解:这就像你刚踏入一个新的游戏世界,得先搞清楚游戏的基本规则和操作方法。在 Vue 3 的学习里,就是要搭建好开发环境,认识 Vue 3 的基本概念,比如模…...
c++ 文件及基本读写总结
在 C 中,文件操作是非常重要的一部分,主要用于将数据存储到文件中,或者从文件中读取数据。C 标准库提供了fstream头文件,其中包含了用于文件操作的类,主要有ifstream(用于输入文件流,即从文件读…...
如何调试Linux内核?
通过创建一个最小的根文件系统,并使用QEMU和GDB进行调试。 1.准备工作环境 确保系统上安装了所有必要的工具和依赖项。 sudo apt-get update //更新一下软件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…...
Docker入门指南:Windows下docker配置镜像源加速下载
Windows下docker配置镜像源加速下载 docker的官方镜像是海外仓库,默认下载耗时较长,而且经常出现断站的现象,因此需要配置国内镜像源。 国内镜像源概述 国内现有如下镜像源可以使用 "http://hub-mirror.c.163.com", "http…...
java后端开发day24--阶段项目(一)
(以下内容全部来自上述课程) GUI:Graphical User Interface 图形用户接口,采取图形化的方式显示操作界面 分为两套体系:AWT包(有兼容问题)和Swing包(常用) 拼图小游戏…...
TVbox蜂蜜影视:智能电视观影新选择,简洁界面与强大功能兼具
蜂蜜影视是一款基于猫影视开源项目 CatVodTVJarLoader 开发的智能电视软件,专为追求简洁与高效观影体验的用户设计。该软件从零开始编写,界面清爽,操作流畅,特别适合在智能电视上使用。其最大的亮点在于能够自动跳过失效的播放地址…...
2025.3.2机器学习笔记:PINN文献阅读
2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊: Water Resource…...
2025AI 有哪些重要的发展趋势?
2025 年,AI 有哪些重要的发展趋势? 看看大佬们的看法: 马斯克:“人形机器人生产、自动驾驶突破、脑机接口进化” 奥特曼:“2025年,AGI即将到来” 黄仁勋:“通用机器人元年、能源效率的提升”…...
uni-app 全局请求封装:支持 Promise,自动刷新 Token,解决 401 过期问题
在 uni-app 中封装一个全局通用的 ajax 请求函数,支持 Promise,使用 uni.request() 进行请求,并且具备 自动刷新 token 的功能。以下是详细步骤: 实现步骤 创建 request.js 统一封装 ajax 请求管理 token(存储、获取、…...
IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程
背景:最近DeepSeek比较火嘛,然后在githup上也看到了GitHub Copilot,就想着现在AI的准确率已经可以提高工作效率了。所以从网上找了一些编程插件,发现Proxy支持的模型比较多,通用性和适配性比较好。所以本文记录一下pro…...
【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.1.2字段类型选择:keyword vs text、nested对象
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 第2章 数据建模与高效写入:ES字段类型选择最佳实践:keyword vs text与nested对象深度解析1. 索引设计核心原则2. keyword与text类型终极对决2.1 核心…...
【前端基础】Day 3 CSS-2
目录 1. Emmet语法 1.1 快速生成HTML结构语法 1.2 快速生成CSS样式语法 2. CSS的复合选择器 2.1 后代选择器 2.2 子选择器 2.3 并集选择器 2.4 伪类选择器 2.4.1 链接伪类选择器 2.4.2 focus伪类选择器 2.5 复合选择器总结 3. CSS的元素显示模式 3.1 什么是元素显示…...
windows电脑上安装llama-factory实现大模型微调
一、安装环境准备 这是官方给的llama-factory安装教程,安装 - LLaMA Factory,上面介绍了linux系统上以及windows系统上如何正确安装。大家依照安装步骤基本能够完成安装,但是可能由于缺少经验或者相关的知识导致启动webUi界面运行相应内容时…...
汽车无人驾驶系统中的防撞设计
一、系统方案介绍 无人驾驶汽车的防撞系统是保障行车安全的核心模块,本文设计的系统以STM32F103C8T6单片机为主控制器,结合超声波测距、WiFi通信、人机交互等模块,实现障碍物实时检测、动态阈值设置、多级报警和数据可视化功能。系统通过软…...
sql server 版本更新日期
SQL Server 2019 内部版本(KB4518398) - SQL Server | Microsoft Learn SQL Server 的最新更新和版本历史记录 - SQL Server | Microsoft Learn sql server 2019 版本更新时间和补丁版本号...
Linux网络 DNS
DNS(Domain Name System) TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 , 但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串 , 并且使用 hosts 文件来描述主机名和 IP 地址的关系 。 最初 , 通过互连网信息中…...
EMQX中不同端口对应的接入协议
使用tcp接入时应使用mqtt://IP:1883 使用ws接入时应使用ws://IP:8083...
SpringBoot原理-03.自动配置-方案
一.自动配置原理 探究自动配置原理,就是探究spring是如何在运行时将要依赖JAR包提供的配置类和bean对象注入到IOC容器当中。我们当前准备一个maven项目itheima-utils,这里面定义了bean对象以及配置类,用来模拟第三方提供的依赖,首…...
Python 如何实现烟花效果的完整代码
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Winbox5怎样设置上网
要让连接到交换机的设备都能上网,需在MikroTik路由器(通过WinBox配置)上完成以下步骤。假设您的网络拓扑是:外网IP配置在路由器的WAN口,内网设备通过交换机连接到路由器的LAN口。 步骤 1:配置内网接口&…...
(KTransformers) RTX4090单卡运行 DeepSeek-R1 671B
安装环境为:ubuntu 22.04 x86_64 下载模型 编辑文件vim url.list 写入如下内容 https://modelscope.cn/models/unsloth/DeepSeek-R1-GGUF/resolve/master/DeepSeek-R1-Q4_K_M/DeepSeek-R1-Q4_K_M-00001-of-00009.gguf https://modelscope.cn/models/unsloth/Dee…...
【软考-架构】1.2、指令系统-存储系统-cache
GitHub地址:https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 指令系统 计算机指令执行过程:取指令一一分析指令一一执行指令三个步骤,首先将程序计数器PC中的指令地址取出,送入地址总线,CPU依据…...
CI/CD与容器化技术核心知识点的QA
CI/CD与容器化技术核心知识点的Q&A 以下是CI/CD和容器化技术的经典必考面试题及详解,结合行业实践与理论核心整理而成: 一、CI/CD核心概念与流程 简述CI/CD的核心目标与实现价值 答案:通过自动化流水线实现快速、可靠的软件交付,减少人工干预,提升开发与运维协作效率…...
动态规划刷题
文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示:dp[i],表示dp表中i下标位置的值 2. 状态转移方程:以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] …...
不谓侠--记录
音乐《不谓侠》 衣襟上 别好了晚霞 余晖送我牵匹老马 正路过 烟村里人家 恰似当年故里正飞花 醉过风 喝过茶 寻常巷口寻个酒家 在座皆算老友 碗底便是天涯 天涯远 无处不为家 蓬门自我也像广厦 论意气 不计多或寡 占三分便敢自称为侠 刀可捉 拳也耍 偶尔闲来…...
2025-03-01 学习记录--C/C++-C语言 整数类型对比
C语言 整数类型对比 类型位数范围(有符号)范围(无符号)格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…...
Python核心技术,Django学习基础入门教程(附环境安装包)
文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...
