Java对象内存布局: 一个Object对象到底占用多少字节?用JOL工具解开谜底
Java对象内存布局: 一个Object对象到底占用多少字节用JOL工具解开谜底引言: 一个看似简单却暗藏玄机的问题Java中一个空Object对象占多少字节 这是面试中常见的深坑题。初级回答可能是不知道中级回答可能是8字节或16字节而高级回答则需要从对象头、对齐填充、指针压缩等多个维度展开。实际上答案取决于JVM是32位还是64位、是否开启指针压缩、以及具体JVM实现。本文将使用JOL(Java Object Layout)工具直观地展示对象在内存中的真实布局揭开这道经典面试题背后的底层原理。一、Java对象内存布局概览1.1 三大部分结构MarkWord内容(64位)对象头组成Java对象内存布局对象头Object Header实例数据Instance Data对齐填充PaddingMark Word(标记字)Klass Pointer(类型指针)数组长度(仅数组对象)锁标志位: 2bit偏向锁标志: 1bitGC分代年龄: 4bitidentity_hashcode: 31bitunused: 25bit1.2 各组成部分详解public class ObjectLayoutOverview { public static void main(String[] args) { System.out.println( Java对象内存布局 \n); System.out.println(1. 对象头 (Object Header)); System.out.println( - Mark Word: 存储对象自身运行时数据); System.out.println( * 哈希码 (identity_hashcode)); System.out.println( * GC分代年龄); System.out.println( * 锁状态标志); System.out.println( * 线程持有的锁); System.out.println( * 偏向线程ID); System.out.println( - Klass Pointer: 指向方法区类元数据的指针); System.out.println( - 数组长度: 如果是数组对象存储数组长度\n); System.out.println(2. 实例数据 (Instance Data)); System.out.println( - 父类继承的字段); System.out.println( - 子类定义的字段); System.out.println( - 按字段类型和长度排序存储\n); System.out.println(3. 对齐填充 (Padding)); System.out.println( - HotSpot要求对象大小必须是8字节的倍数); System.out.println( - 不足时填充补齐); } }二、JOL工具入门: 让对象内存布局一目了然2.1 JOL的引入与基本使用import org.openjdk.jol.info.ClassLayout; import org.openjdk.jol.info.GraphLayout; import org.openjdk.jol.vm.VM; /** * JOL (Java Object Layout) 工具演示 * Maven依赖: * dependency * groupIdorg.openjdk.jol/groupId * artifactIdjol-core/artifactId * version0.16/version * /dependency */ public class JOLBasicDemo { public static void main(String[] args) { // 1. 查看JVM基本信息 System.out.println( JVM信息 ); System.out.println(VM.current().details()); // 2. 查看空Object的内存布局 System.out.println(\n 空Object对象 ); Object obj new Object(); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); // 3. 查看空String的内存布局 System.out.println(\n 空String对象 ); String emptyString ; System.out.println(ClassLayout.parseInstance(emptyString).toPrintable()); // 4. 查看Integer对象 System.out.println(\n Integer(100) 对象 ); Integer integer 100; System.out.println(ClassLayout.parseInstance(integer).toPrintable()); } }2.2 解读JOL输出结果/** * JOL输出格式解读 * * 典型输出: * java.lang.Object object internals: * OFFSET SIZE TYPE DESCRIPTION VALUE * 0 4 (object header) 01 00 00 00 * 4 4 (object header) 00 00 00 00 * 8 4 (object header) 1b 32 02 f8 * 12 4 (loss due to the next object alignment) * Instance size: 16 bytes * Space losses: 0 bytes internal 4 bytes external 4 bytes total */ public class JOLOutputExplanation { public static void main(String[] args) { System.out.println(JOL输出格式说明:\n); System.out.println(OFFSET(偏移量): 字段在对象中的起始位置); System.out.println(SIZE(大小): 字段占用的字节数); System.out.println(TYPE(类型): 字段的Java类型); System.out.println(DESCRIPTION(描述): 字段说明); System.out.println(VALUE(值): 内存中的实际值(十六进制)\n); System.out.println(Instance size: 对象总大小(含padding)); System.out.println(Space losses: 内存浪费字节数\n); Object obj new Object(); System.out.println(空Object实际布局:); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); } }三、指针压缩: 64位JVM的性能平衡术3.1 为什么需要指针压缩/** * 指针压缩(Compressed Oops)原理 * * Oop Ordinary Object Pointer (普通对象指针) * * 64位JVM中: * - 不压缩: 指针占8字节堆最大可达2^64但内存消耗大 * - 压缩后: 指针占4字节堆最大可达32GB(2^32 * 8字节对齐) * * 压缩原理: * 由于HotSpot要求对象8字节对齐地址最低3位始终为000 * 因此可以将32位指针左移3位表示35位地址空间(2^35 32GB) */ public class CompressedOopsDemo { public static void main(String[] args) { System.out.println( 指针压缩(CompressedOops)详解 \n); System.out.println(压缩原理:); System.out.println( 64位地址: 0x00000000_00000000_00000000_00000000); System.out.println( 对象8字节对齐: 地址低3位始终为0); System.out.println( 压缩编码: 去掉低3位存入32位); System.out.println( 解压解码: 32位 3恢复地址\n); System.out.println(压缩前: Klass Pointer 8字节); System.out.println(压缩后: Klass Pointer 4字节); System.out.println(节省: 每个对象4字节\n); // 对比压缩与不压缩 System.out.println( 当前JVM状态 ); System.out.println(VM.current().details()); Object obj new Object(); System.out.println(\n当前对象布局:); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); } }3.2 开启/关闭指针压缩的效果对比/** * 指针压缩开启与关闭对比 * * JVM参数: * -XX:UseCompressedOops 开启指针压缩(JDK 7 默认开启) * -XX:-UseCompressedOops 关闭指针压缩 * -XX:UseCompressedClassPointers 开启类指针压缩(JDK 8 默认开启) */ public class CompressedOopsComparison { public static void main(String[] args) { System.out.println( 指针压缩对比 \n); // 检查是否开启压缩 boolean compressedOops isCompressedOopsEnabled(); System.out.println(UseCompressedOops: compressedOops); System.out.println(UseCompressedClassPointers: isCompressedClassPointersEnabled()); System.out.println(\n当前对象大小:); Object obj new Object(); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); System.out.println(理论上:); System.out.println( 压缩开启: Object 16字节); System.out.println( Mark Word: 8字节); System.out.println( Klass Pointer: 4字节); System.out.println( Padding: 4字节); System.out.println( 压缩关闭: Object 16字节(巧合也是16)); System.out.println( Mark Word: 8字节); System.out.println( Klass Pointer: 8字节); System.out.println( Padding: 0字节(正好16,8字节对齐)); } private static boolean isCompressedOopsEnabled() { // 通过对象布局中间接判断 Object obj new Object(); String layout ClassLayout.parseInstance(obj).toPrintable(); // 如果对象头总共占12字节(84)则压缩开启 return layout.contains(12) !layout.contains(16 (object header)); } private static boolean isCompressedClassPointersEnabled() { return true; // 简化判断 } }四、Mark Word: 对象头的瑞士军刀4.1 Mark Word在不同锁状态下的结构MarkWord结构变化(64位JVM)无锁状态:unused:25bit | hashcode:31bit | unused:1 | age:4 | biased_lock:1 | lock:2biased_lock0, lock01偏向锁:threadId:54bit | epoch:2 | unused:1 | age:4 | biased_lock:1 | lock:2biased_lock1, lock01轻量级锁:ptr_to_lock_record:62bit | lock:2lock00重量级锁:ptr_to_monitor:62bit | lock:2lock10GC标记:空 | lock:2lock114.2 使用JOL观察锁状态变化/** * 使用JOL观察不同锁状态下的Mark Word变化 */ public class MarkWordLockStateDemo { public static void main(String[] args) throws InterruptedException { // 确保偏向锁已启动(默认延迟4秒) Thread.sleep(5000); Object lock new Object(); // 1. 无锁状态 System.out.println( 1. 无锁状态 ); System.out.println(ClassLayout.parseInstance(lock).toPrintable()); // 计算hashCode会写入Mark Word System.out.println(hashCode: Integer.toHexString(lock.hashCode())); System.out.println(计算hashCode后(无锁但hash已填充):); System.out.println(ClassLayout.parseInstance(lock).toPrintable()); // 2. 偏向锁状态 System.out.println(\n 2. 偏向锁状态 ); Object biasedLock new Object(); synchronized (biasedLock) { System.out.println(持有偏向锁:); System.out.println(ClassLayout.parseInstance(biasedLock).toPrintable()); } // 3. 轻量级锁状态 System.out.println(\n 3. 轻量级锁状态 ); Object lightLock new Object(); Thread t1 new Thread(() - { synchronized (lightLock) { System.out.println(线程1持有轻量级锁:); System.out.println(ClassLayout.parseInstance(lightLock).toPrintable()); } }); t1.start(); // 另一个线程竞争触发轻量级锁 Thread t2 new Thread(() - { synchronized (lightLock) { System.out.println(线程2竞争后(偏向锁撤销):); System.out.println(ClassLayout.parseInstance(lightLock).toPrintable()); } }); t2.start(); t1.join(); t2.join(); // 4. 重量级锁状态 System.out.println(\n 4. 重量级锁状态 ); Object heavyLock new Object(); Thread holder new Thread(() - { synchronized (heavyLock) { System.out.println(持有锁的线程:); System.out.println(ClassLayout.parseInstance(heavyLock).toPrintable()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); holder.start(); Thread.sleep(100); // 确保持有者先获取锁 // 多个线程竞争膨胀为重量级锁 for (int i 0; i 3; i) { new Thread(() - { synchronized (heavyLock) { System.out.println(Thread.currentThread().getName() 竞争锁:); } }, Competitor- i).start(); } holder.join(); Thread.sleep(500); System.out.println(竞争结束后(可能仍是重量级锁):); System.out.println(ClassLayout.parseInstance(heavyLock).toPrintable()); } }五、自定义对象内存布局分析5.1 字段重排序对内存的影响/** * 字段重排序: JVM会优化字段排列以减少内存占用 */ public class FieldReorderingDemo { // 未优化的字段排列 static class UnoptimizedOrder { byte b; // 1字节 long l; // 8字节 int i; // 4字节 short s; // 2字节 boolean flag; // 1字节 char c; // 2字节 // 总共: 184212 18字节 // 实际: 需要对齐填充 } // JVM自动重排序后的等价排列 static class OptimizedOrder { // JVM重排序规则: // 1. 按字段长度从大到小排列 // 2. 相同长度的按声明顺序排列 // 3. 父类字段在子类字段之前 long l; // 8字节 (offset0) int i; // 4字节 (offset8) short s; // 2字节 (offset12) char c; // 2字节 (offset14) byte b; // 1字节 (offset16) boolean flag; // 1字节 (offset17) // 6字节padding 24字节 (8的倍数) } public static void main(String[] args) { System.out.println( 字段重排序演示 \n); System.out.println(原始声明顺序:); System.out.println(byte b, long l, int i, short s, boolean flag, char c); System.out.println(字段大小总计: 18字节\n); UnoptimizedOrder obj new UnoptimizedOrder(); System.out.println(JVM自动优化后的实际布局:); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); } }5.2 继承链下的内存布局/** * 继承链中的对象内存布局 */ public class InheritanceLayoutDemo { static class GrandParent { long grandField 1L; // 8字节 } static class Parent extends GrandParent { int parentField 2; // 4字节 byte parentByte 3; // 1字节 } static class Child extends Parent { short childShort 4; // 2字节 boolean childFlag true; // 1字节 } public static void main(String[] args) { System.out.println( 继承链对象布局 \n); Child child new Child(); System.out.println(Child对象(继承GrandParent - Parent):); System.out.println(ClassLayout.parseInstance(child).toPrintable()); System.out.println(布局规则:); System.out.println(1. 父类字段优先排列); System.out.println(2. 每个类内部按字段长度排序); System.out.println(3. 子类字段追加在父类字段之后); System.out.println(4. 热点字段(频繁访问)可能被提前); } }5.3 数组对象的内存布局/** * 数组对象的内存布局 */ public class ArrayLayoutDemo { public static void main(String[] args) { System.out.println( 数组对象布局 \n); // 基本类型数组 int[] intArray new int[3]; System.out.println(int[3]:); System.out.println(ClassLayout.parseInstance(intArray).toPrintable()); long[] longArray new long[3]; System.out.println(long[3]:); System.out.println(ClassLayout.parseInstance(longArray).toPrintable()); byte[] byteArray new byte[3]; System.out.println(byte[3]:); System.out.println(ClassLayout.parseInstance(byteArray).toPrintable()); // 引用类型数组 String[] strArray new String[3]; System.out.println(String[3]:); System.out.println(ClassLayout.parseInstance(strArray).toPrintable()); System.out.println(数组对象头组成:); System.out.println( Mark Word: 8字节); System.out.println( Klass Pointer: 4字节(压缩)); System.out.println( 数组长度: 4字节); System.out.println( 数组头总计: 16字节); } }六、完整的内存占用计算工具6.1 手动计算工具类/** * Java对象内存占用计算工具 */ public class ObjectSizeCalculator { // JVM内存模型常量(64位指针压缩开启) private static final int MARK_WORD_SIZE 8; // Mark Word固定8字节 private static final int KLASS_POINTER_SIZE 4; // 压缩后4字节 private static final int ARRAY_LENGTH_SIZE 4; // 数组长度4字节 private static final int OBJECT_HEADER_SIZE MARK_WORD_SIZE KLASS_POINTER_SIZE; private static final int ARRAY_HEADER_SIZE OBJECT_HEADER_SIZE ARRAY_LENGTH_SIZE; private static final int ALIGNMENT 8; // 8字节对齐 /** * 计算非数组对象的大小 */ public static int calculateObjectSize(Class? clazz) { int size OBJECT_HEADER_SIZE; // 递归计算父类字段 Class? current clazz; while (current ! null current ! Object.class) { for (java.lang.reflect.Field field : current.getDeclaredFields()) { if (!java.lang.reflect.Modifier.isStatic(field.getModifiers())) { size getFieldSize(field.getType()); } } current current.getSuperclass(); } // 对齐到8字节倍数 return alignTo8(size); } /** * 获取类型对应的字节大小 */ private static int getFieldSize(Class? type) { if (type boolean.class || type byte.class) return 1; if (type char.class || type short.class) return 2; if (type int.class || type float.class) return 4; if (type long.class || type double.class) return 8; return KLASS_POINTER_SIZE; // 引用类型压缩后4字节 } /** * 对齐到8字节的倍数 */ private static int alignTo8(int size) { return (size (ALIGNMENT - 1)) ~(ALIGNMENT - 1); } public static void main(String[] args) { System.out.println( 对象大小计算示例 \n); System.out.println(Object: calculateObjectSize(Object.class) 字节); System.out.println(String(空): calculateObjectSize(String.class) 字节 内部char[]); // 验证 Object obj new Object(); System.out.println(\nJOL验证Object大小:); System.out.println(ClassLayout.parseInstance(obj).toPrintable()); } }6.2 使用JOL的GraphLayout查看对象图/** * 使用GraphLayout查看对象引用图的内存占用 */ public class GraphLayoutDemo { static class Person { String name; int age; Address address; Person(String name, int age, Address address) { this.name name; this.age age; this.address address; } } static class Address { String city; String street; Address(String city, String street) { this.city city; this.street street; } } public static void main(String[] args) { System.out.println( 对象图内存占用 \n); Address address new Address(Beijing, Changan Avenue); Person person new Person(Alice, 25, address); // 查看单个对象 System.out.println(Person对象自身:); System.out.println(ClassLayout.parseInstance(person).toPrintable()); // 查看完整对象图的内存占用 System.out.println(\n完整对象图(含引用对象):); System.out.println(GraphLayout.parseInstance(person).toPrintable()); // 查看总大小 System.out.println(对象图总大小: GraphLayout.parseInstance(person).totalSize() 字节); } }七、面试高频问题总结/** * 面试高频问题与标准答案 */ public class InterviewQuestions { public static void main(String[] args) { System.out.println( Object内存占用面试高频问题 \n); // Q1 System.out.println(Q1: 一个空Object对象占多少字节?); System.out.println(A: 分情况:); System.out.println( 64位JVM 指针压缩: 16字节); System.out.println( (Mark Word 8字节 Klass Pointer 4字节 Padding 4字节)); System.out.println( 64位JVM 无压缩: 16字节); System.out.println( (Mark Word 8字节 Klass Pointer 8字节 Padding 0字节)); System.out.println( 32位JVM: 8字节); System.out.println( (Mark Word 4字节 Klass Pointer 4字节)\n); // Q2 System.out.println(Q2: 为什么对象需要8字节对齐?); System.out.println(A: 三个原因:); System.out.println( 1. CPU按字长访问内存8字节对齐提高读取效率); System.out.println( 2. 压缩指针利用低3位始终为0可表示更大地址空间); System.out.println( 3. 简化JVM内存管理减少碎片\n); // Q3 System.out.println(Q3: 压缩指针的适用条件是什么?); System.out.println(A: 三个条件:); System.out.println( 1. 堆内存 32GB (超过则自动关闭)); System.out.println( 2. 对象8字节对齐); System.out.println( 3. 未显式关闭(-XX:-UseCompressedOops)\n); // Q4 System.out.println(Q4: int[3] 数组占多少字节?); System.out.println(A: 计算过程:); System.out.println( 数组头: 16字节(Mark Word 8 Klass Pointer 4 Length 4)); System.out.println( 数据: 3 * 4 12字节); System.out.println( 总计: 28字节 - 对齐到32字节\n); // 验证 int[] arr new int[3]; System.out.println(JOL验证:); System.out.println(ClassLayout.parseInstance(arr).toPrintable()); } }八、总结8.1 核心知识点速查表| 对象类型 | Mark Word | Klass Pointer | 数组长度 | 实例数据 | 总大小(压缩) ||---------|-----------|---------------|---------|---------|-------------|| Object | 8字节 | 4字节 | - | 0 | 16字节(含4字节Padding) || Integer | 8字节 | 4字节 | - | 4字节(int值) | 16字节 || Long | 8字节 | 4字节 | - | 8字节(long值) | 24字节(含4字节Padding) || String(空) | 8字节 | 4字节 | - | 4字节(引用) 4字节(int) | 24字节(含4字节Padding) || int[3] | 8字节 | 4字节 | 4字节 | 12字节(3*4) | 32字节(含4字节Padding) || long[3] | 8字节 | 4字节 | 4字节 | 24字节(3*8) | 40字节 |8.2 关键结论空Object在64位压缩JVM下固定16字节Mark Word始终8字节(64位)Klass Pointer压缩后4字节所有对象必须8字节对齐JVM会自动重排字段顺序以减少内存占用压缩指针可将堆上限扩展到32GB---如果本文帮你搞懂了Java对象内存布局的奥秘欢迎点赞收藏。有任何疑问欢迎评论区交流

相关新闻

空间音频全解析:从概念到体验,你想了解的都在这!

空间音频全解析:从概念到体验,你想了解的都在这!

ZDNET核心要点空间音频(Spatial audio)在多款旗舰级耳机、耳塞、音箱和条形音箱中都有宣传。它是个统称,不过3D音景包含更多元素。体验3D音频的最佳方式取决于音频格式和设备兼容性。如今,空间音频无处不在,条形音箱、…

2026/10/17 21:02:12 阅读更多 →
游泳馆APP软件开发可以获取哪些平台收益

游泳馆APP软件开发可以获取哪些平台收益

到了夏天,又是游泳馆营业的时候的,在炎热的夏天来一次清爽的游泳体验,能够更好地放松身心。为了满足人们对于游泳体验方面的需求,游泳馆APP软件开发也可以提供线上一站式服务,优化用户的整体体验感。一、游泳馆APP软件…

2026/10/17 21:02:11 阅读更多 →
磁盘空间分析工具 TreeSize 转订阅模式,永久许可证维护期后不订阅就没支持!

磁盘空间分析工具 TreeSize 转订阅模式,永久许可证维护期后不订阅就没支持!

TreeSize 永久许可证政策引用户不满磁盘空间分析工具 TreeSize 的开发商 JAM Software 近期惹恼了部分用户。该公司规定永久许可证在维护期结束后,若客户不订阅服务,将不再提供支持或更新。而且长期以来,永久许可证支持期结束后,不…

2026/10/16 1:25:50 阅读更多 →

最新新闻

2026年AI编程工具全解析:33款主流助手与IDE选型指南

2026年AI编程工具全解析:33款主流助手与IDE选型指南

2024年大家还在争论“AI能不能写代码”,到2026年这个问题基本不需要讨论了。我今年在好几个项目里把AI编程工具从“偶尔试用”变成了“日常主力”,从代码补全到自动化测试再到完整功能模块的实现,工具链已经成熟得超出预期。但问题也变成了另…

2026/10/17 21:02:08 阅读更多 →
Vibe Coding第二课:零基础搭建个人主页和数字分身

Vibe Coding第二课:零基础搭建个人主页和数字分身

Vibe Coding这个词,最近在开发者圈子里被反复讨论,但对真正零基础的人来说,它最诱人的点其实特别简单:你不需要先把编程学个半吊子,就能做出能给别人看的东西。第二课我们直接来干一件特别实在的事——从0到1搭一个你自…

2026/10/17 21:02:08 阅读更多 →
分步傅里叶法解NLS方程:MATLAB仿真孤子传输实战

分步傅里叶法解NLS方程:MATLAB仿真孤子传输实战

简介:非线性光纤光学与光通信领域的学习者、研究人员,常需掌握分步傅里叶法求解非线性薛定谔方程(NLS)的数值实现。该资源包提供了一份MATLAB源代码及详细解析文档,内容涵盖NLS方程建模、分步傅里叶法原理、代码结构梳…

2026/10/17 21:02:08 阅读更多 →
MATLAB调用外部软件:控件化封装与COM/system/MEX选型实战

MATLAB调用外部软件:控件化封装与COM/system/MEX选型实战

1. 项目缘起与整体设计思路1.1 为什么要在MATLAB里“调用”外部软件做过工程仿真或者数据处理的朋友大概率遇到过这种场景:手头有一套用MATLAB写的算法主流程,但某个关键环节依赖一个独立的第三方软件——可能是某个专业的求解器、一个老旧的C计算程序、…

2026/10/17 21:02:08 阅读更多 →
全网最全Python课程PDF如何高效利用:拆目录、验代码、避坑指南

全网最全Python课程PDF如何高效利用:拆目录、验代码、避坑指南

简介:一份以 PDF 文档形式整理的全网 Python 系统课程学习路线,适合零基础入门到希望进阶的开发者使用。文档提炼了 637 集课程的整体框架,按 Python 基础、进阶、终极、爬虫四篇展开,覆盖 Python 基础语法、坦克大战实战、网络并…

2026/10/17 21:02:08 阅读更多 →
约瑟夫环C语言循环链表实现:从建环到出圈的完整方案

约瑟夫环C语言循环链表实现:从建环到出圈的完整方案

简介:这是一份面向C语言初学者与数据结构学习者的约瑟夫死亡游戏完整实现资料,围绕循环链表这一核心结构展开,帮助读者理解环形链表的创建、遍历与结点删除等经典操作。资源包内仅含1个docx文档,大小约18KB,以文字形式…

2026/10/17 21:01:07 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →