JVM & Spring Boot知识体系

SPSS线性混合模型实战:手把手复现一篇老年认知研究的统计结果(含代码) 本文详细介绍了如何使用SPSS线性混合效应模型复现老年认知研究的统计结果,涵盖数据准备、模型构建、结果解读及可视化全流程。特别针对重复测量数据分析,提供了SPSS菜单操作与语法编写的实用技巧,帮助研究者高效处理复杂数据并验证模型假设。 阅读详情

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

一、JVM知识体系概述

1. 类加载机制

类加载机制是JVM实现动态性、扩展性的关键。在Java程序执行过程中,类加载器负责将类信息从字节码文件加载到JVM中。类加载过程涉及以下细节:

  • 加载:类加载器通过文件系统或网络获取字节码文件,并将其存储到方法区中。在加载过程中,JVM会验证字节码文件的正确性,确保其符合Java语言规范。
  • 验证:验证过程包括文件格式验证、字节码验证、符号引用验证等,以确保加载的类信息是安全的。
  • 准备:为类变量分配内存,并设置默认初始值。对于基本数据类型,如int、float等,其初始值为0;对于引用类型,如对象引用,其初始值为null。
  • 解析:将符号引用转换为直接引用,即将类、接口、字段和方法的符号引用替换为直接引用。
2. 类加载过程

类加载过程是一个动态的过程,具体步骤如下:

  • 启动:当JVM启动时,会初始化系统类加载器(Bootstrap ClassLoader)。
  • 加载:类加载器根据需要加载类定义信息。
  • 验证:对加载的类进行验证,确保其安全性和正确性。
  • 准备:为类变量分配内存,并设置默认初始值。
  • 解析:将符号引用转换为直接引用。
  • 初始化:执行类构造器(clinit)方法,初始化类变量和静态变量。
3. 双亲委派模型

双亲委派模型规定类加载器在尝试加载类时,首先将请求委派给父类加载器处理。这种模型的优点是避免类的重复加载,以及确保核心API的一致性。具体实现细节如下:

  • 当子类加载器请求加载类时,它会首先请求其父类加载器加载该类。
  • 如果父类加载器能够加载该类,则直接返回该类;否则,子类加载器将尝试自己加载该类。
  • 这种委托关系一直向上传递,直到到达顶层的Bootstrap ClassLoader。
4. 自定义类加载器

自定义类加载器允许开发者根据需要控制类的加载过程。例如,可以实现一个网络类加载器,从远程服务器加载类定义信息。具体实现细节如下:

  • 继承java.lang.ClassLoader类,并重写findClass方法。
  • 在findClass方法中,实现从特定来源(如网络)加载类定义信息的逻辑。
5. 模块化系统(JPMS)

Java Platform Module System(JPMS)是Java 9引入的一个模块化系统,它允许开发者将应用程序分解成多个模块,从而提高系统的可维护性和性能。具体实现细节如下:

  • 使用module-info.java文件定义模块,包括模块名称、依赖关系等。
  • 使用模块路径(module-path)指定模块的搜索目录。
  • 使用--module选项运行应用程序,指定主模块。
6. 内存模型

JVM的内存模型包括运行时数据区和堆栈:

  • 堆:存储所有实例和数组,是动态分配内存的区域。在JVM启动时,会根据-Xmx参数设置堆的最大大小。
  • 栈:存储局部变量和方法调用栈,是线程私有的内存区域。栈空间大小通常由-Xss参数设置。
  • 方法区:存储类信息、常量、静态变量等,是共享内存区域。方法区的大小通常由-Xmx参数设置。
  • PC寄存器:用于存储当前执行线程的方法指令指针,是线程私有的内存区域。
7. 内存溢出场景分析

内存溢出通常发生在以下场景:

  • 持续创建对象导致堆空间不足:例如,在循环中不断创建对象,且对象生命周期长。
  • 栈溢出,通常由于递归调用深度过大:例如,递归函数调用深度超过栈空间大小。
  • 方法区不足,可能导致类定义无法加载:例如,加载大量类或使用大型的内部类。
8. 直接内存管理

直接内存管理允许Java程序直接使用操作系统内存,不受堆栈大小的限制。具体实现细节如下:

  • 使用java.nio包中的ByteBuffer类分配直接内存。
  • 通过ByteBuffer的allocateDirect方法分配直接内存。
9. 垃圾回收

垃圾回收是JVM自动内存管理的关键。垃圾回收器通过标记-清除、复制、整理等算法回收不再使用的对象。具体实现细节如下:

  • 标记-清除算法:首先标记所有可达对象,然后清除未被标记的对象。
  • 复制算法:将对象复制到另一块内存区域,并释放原内存区域。
  • 整理算法:移动对象,使内存区域连续,便于垃圾回收。
10. GC Roots可达性分析

GC Roots是垃圾回收的起点,通过可达性分析确定哪些对象是可以回收的。具体实现细节如下:

  • 根节点:包括栈帧中的引用变量、方法区中的常量引用、本地方法栈中的引用变量等。
  • 链式可达性:从根节点开始,遍历所有可达对象,形成可达对象链。
11. 分代收集理论

分代收集理论将堆内存分为新生代(Young)和老年代(Old),针对不同代采取不同的回收策略。具体实现细节如下:

  • 新生代:主要回收新生代对象,采用复制算法。
  • 老年代:主要回收老年代对象,采用标记-清除或标记-整理算法。
12. 引用类型

Java中的引用类型包括强引用、软引用、弱引用和虚引用,它们决定了对象在内存中的生命周期。具体实现细节如下:

  • 强引用:最普通的引用类型,当对象被强引用时,垃圾回收器不会回收该对象。
  • 软引用:用于缓存对象,当内存不足时,垃圾回收器会回收软引用对象。
  • 弱引用:用于临时存储对象,当垃圾回收器执行时,会回收弱引用对象。
  • 虚引用:用于跟踪对象的生命周期,当对象被回收时,虚引用的引用计数器会增加。
13. 垃圾回收算法

常见的垃圾回收算法包括标记-清除、复制、整理等。具体实现细节如下:

  • 标记-清除算法:首先标记所有可达对象,然后清除未被标记的对象。
  • 复制算法:将对象复制到另一块内存区域,并释放原内存区域。
  • 整理算法:移动对象,使内存区域连续,便于垃圾回收。
14. 并发收集器

并发收集器如CMS(Concurrent Mark Sweep)和G1(Garbage-First)在执行垃圾回收时与应用程序并发执行,以减少停顿时间。具体实现细节如下:

  • CMS(Concurrent Mark Sweep):在垃圾回收过程中,与应用程序并发执行,主要回收老年代对象。
  • G1(Garbage-First):在垃圾回收过程中,与应用程序并发执行,主要回收堆内存中垃圾回收价值最高的区域。
15. 停顿时间控制策略

JVM提供了多种策略来控制垃圾回收时的停顿时间,如G1的停顿时间目标。具体实现细节如下:

  • 停顿时间目标:设置垃圾回收时的最大停顿时间。
  • 自适应调整:根据历史数据,动态调整垃圾回收策略,以实现停顿时间目标。
16. 性能调优

性能调优包括JVM参数配置(如-Xms、-Xmx)和垃圾回收器选择。具体实现细节如下:

  • JVM参数配置:通过设置JVM参数,如堆大小、栈大小等,优化JVM性能。
  • 垃圾回收器选择:根据应用程序的特点,选择合适的垃圾回收器。
17. 内存泄漏诊断

内存泄漏是指程序中已分配的内存无法被垃圾回收器回收,导致内存占用逐渐增加。具体实现细节如下:

  • 内存泄漏检测工具:使用内存泄漏检测工具,如MAT(Memory Analyzer Tool)、VisualVM等,分析内存占用情况。
  • 内存泄漏定位:根据内存占用情况,定位内存泄漏的原因。
18. JIT编译优化

JIT(Just-In-Time)编译器是JVM的一部分,它将字节码编译成本地机器码以提高性能。具体实现细节如下:

  • JIT编译过程:JVM在运行过程中,根据代码执行频率和热点信息,选择热点代码进行编译。
  • JIT编译优化:对编译后的本地机器码进行优化,提高程序性能。

二、Spring Boot知识体系概述

1. 自动配置

Spring Boot的核心特性之一是自动配置,它允许开发者通过标注特定的注解,自动配置Spring应用。具体实现细节如下:

  • @SpringBootApplication:标注主应用程序类,启动Spring Boot应用。
  • @Configuration:标注配置类,用于定义Spring应用中的Bean配置。
  • @EnableAutoConfiguration:标注启动类,启用自动配置功能。
2. @EnableAutoConfiguration原理

@EnableAutoConfiguration注解通过类路径下是否有对应的jar包,根据类名生成配置类,然后自动配置Spring应用。具体实现细节如下:

  • @EnableAutoConfiguration内部使用了SpringFactoriesLoader类,该类负责加载类路径下META-INF/spring.factories文件中的配置类。
  • 在spring.factories文件中,以键值对的形式定义了配置类和对应的类名。
3. 条件化配置(@Conditional)

条件化配置允许开发者根据特定的条件来启用或禁用某些配置。具体实现细节如下:

  • @Conditional注解:标注配置类或方法,根据条件判断是否启用或禁用配置。
  • 条件实现类:实现Condition接口,定义条件判断逻辑。
4. 自定义Starter开发

自定义Starter可以简化依赖管理,方便开发者引入所需的功能。具体实现细节如下:

  • 创建一个Maven项目,定义Starter坐标和依赖关系。
  • 在Starter中添加spring.factories文件,定义自动配置类。
  • 将Starter打包并发布到中央仓库。
5. 起步依赖、依赖管理机制

起步依赖(starters)是一组预定义的依赖,它们包含了构建和运行Spring应用所需的所有库。具体实现细节如下:

  • 起步依赖坐标:在pom.xml文件中,添加起步依赖坐标。
  • 依赖管理:使用Maven或Gradle等构建工具管理依赖关系。
6. 版本冲突解决

依赖管理机制如BOM(Bill of Materials)文件可以帮助解决版本冲突问题。具体实现细节如下:

  • BOM文件:定义了项目依赖的版本信息,确保所有依赖版本一致。
  • 依赖管理工具:使用Maven或Gradle等构建工具读取BOM文件,管理依赖关系。
7. 第三方库集成模式

Spring Boot支持多种第三方库的集成模式,包括自动配置、配置文件等。具体实现细节如下:

  • 自动配置:使用@ConditionalOnClass、@ConditionalOnBean等注解,根据条件判断是否启用第三方库的自动配置。
  • 配置文件:在application.properties或application.yml文件中,配置第三方库的参数。
8. Actuator、健康检查端点

Spring Boot Actuator提供了一系列端点,用于监控和管理Spring Boot应用。具体实现细节如下:

  • Actuator端点:包括/health、/metrics、/info等端点,用于获取应用的健康状态、度量指标、配置信息等。
  • 监控和管理工具:使用Prometheus、Grafana等监控和管理工具,收集和展示Actuator端点提供的数据。
9. 度量指标收集

Actuator可以收集应用的各种度量指标,如内存使用情况、HTTP请求统计等。具体实现细节如下:

  • 度量指标收集器:使用Micrometer等度量指标收集器,收集应用的各种度量指标。
  • 度量指标展示:使用Prometheus、Grafana等工具,展示和应用度量指标。
10. 自定义Endpoint开发

开发者可以根据需要自定义Endpoint来提供特定的监控和管理功能。具体实现细节如下:

  • 继承Endpoint类,实现doInvoke方法。
  • 在application.properties或application.yml文件中,注册自定义Endpoint。
11. 配置文件管理

Spring Boot使用配置文件来管理应用配置,支持多环境配置(如application-{profile}.yml)。具体实现细节如下:

  • 配置文件格式:支持properties和yml格式。
  • 配置文件路径:默认位于src/main/resources目录下,也可以通过配置文件路径指定。
  • 多环境配置:通过配置文件名称,如application-dev.yml、application-prod.yml等,实现多环境配置。
12. 配置加载优先级

配置文件的加载优先级决定了配置的覆盖规则。具体实现细节如下:

  • 配置文件加载顺序:按照配置文件路径的长度进行排序,路径长度越短,优先级越高。
  • 配置文件覆盖规则:当存在同名配置时,后加载的配置会覆盖先加载的配置。
13. 动态配置刷新

Spring Boot支持动态配置刷新,允许在运行时更改配置并重新加载。具体实现细节如下:

  • 配置刷新机制:使用Spring Cloud Config等配置中心,实现配置的动态刷新。
  • 配置刷新方式:通过HTTP请求、JMX等方式,触发配置刷新。
14. 监控与日志

Spring Boot集成了多种监控和日志解决方案,如Micrometer和Logback/SLF4J。具体实现细节如下:

  • 监控解决方案:使用Micrometer等监控解决方案,收集和展示应用的各种监控数据。
  • 日志解决方案:使用Logback/SLF4J等日志解决方案,记录和展示应用的各种日志信息。
15. 分布式链路追踪

Spring Boot支持分布式链路追踪,如Zipkin和Jaeger。具体实现细节如下:

  • 链路追踪框架:使用Zipkin或Jaeger等链路追踪框架,实现分布式应用的链路追踪。
  • 链路追踪数据:收集和存储应用的各种链路追踪数据,如请求ID、请求路径、请求时间等。
16. 扩展机制

Spring Boot提供了多种扩展机制,如自定义AutoConfigurationBean和生命周期扩展点。具体实现细节如下:

  • 自定义AutoConfigurationBean:实现AutoConfigurationImportSelector接口,自定义自动配置类。
  • 生命周期扩展点:实现ApplicationListener接口,监听Spring应用的生命周期事件。
17. 响应式编程支持

Spring Boot支持响应式编程,通过Spring WebFlux实现。具体实现细节如下:

  • Spring WebFlux:基于Reactor项目,提供响应式Web框架。
  • 响应式编程:使用流式编程模型,处理异步事件和数据。

通过以上对JVM和Spring Boot知识体系的概述,我们可以看到这两个技术在现代Java开发中的重要性。JVM作为Java程序的执行环境,提供了高效的运行时支持和垃圾回收机制;而Spring Boot则简化了Spring应用的搭建和开发过程,通过自动配置和模块化设计提高了开发效率。

在实际应用中,JVM和Spring Boot的结合可以发挥出巨大的威力。例如,通过优化JVM配置和垃圾回收策略,可以显著提高Spring Boot应用的性能;而利用Spring Boot的自动配置和响应式编程支持,可以快速构建出高性能、可扩展的微服务架构。

总之,深入理解JVM和Spring Boot的知识体系,对于Java开发者来说至关重要。这不仅有助于提高代码质量和开发效率,还能为构建高性能、可维护的Java应用奠定坚实的基础。

优快云

博主分享

📥博主的人生感悟和目标

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。

面试备战资料

八股文备战
场景描述链接
时间充裕(25万字)Java知识点大全(高频面试题)Java知识点大全
时间紧急(15万字)Java高级开发高频面试题Java高级开发高频面试题

理论知识专题(图文并茂,字数过万)

技术栈链接
RocketMQRocketMQ详解
KafkaKafka详解
RabbitMQRabbitMQ详解
MongoDBMongoDB详解
ElasticSearchElasticSearch详解
ZookeeperZookeeper详解
RedisRedis详解
MySQLMySQL详解
JVMJVM详解

集群部署(图文并茂,字数过万)

技术栈部署架构链接
MySQL使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群Docker-Compose部署教程
Redis三主三从集群(三种方式部署/18个节点的Redis Cluster模式)三种部署方式教程
RocketMQDLedger高可用集群(9节点)部署指南
Nacos+Nginx集群+负载均衡(9节点)Docker部署方案
Kubernetes容器编排安装最全安装教程

开源项目分享

项目名称链接地址
高并发红包雨项目https://gitee.com/java_wxid/red-packet-rain
微服务技术集成demo项目https://gitee.com/java_wxid/java_wxid

管理经验

【公司管理与研发流程优化】针对研发流程、需求管理、沟通协作、文档建设、绩效考核等问题的综合解决方案:https://download.youkuaiyun.com/download/java_wxid/91148718

希望各位读者朋友能够多多支持!

现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

从零开始:使用PacBio HiFi和ONT超长读取组装基因组(保姆级教程) 本文提供了一份从零开始的基因组组装保姆级教程,详细讲解了如何融合PacBio HiFi高精度读长与ONT超长读长数据。内容涵盖数据质控、预处理、混合组装策略选择、结果评估及Hi-C支架构建等关键步骤,旨在帮助研究人员获得高质量的完整基因组。 阅读详情

相关推荐

基于Python+OpenCV中文及符号检测

一、项目背景与意义在图像处理、文档识别、自动翻译等场景中,中文及符号的准确检测是一个重要且复杂的任务。传统的字符检测方法往往对英文等拉丁字母系的识别效果较好,但对中文及特殊符号的识别准确率较低。本项目旨在利用Python编程语言结合OpenCV库,开发一个能够高效、准确地检测图像中中文及符号的系统,为相关领域的研究和应用提供技术支撑。二、技术实现图像预处理:利用OpenCV的图像处理功能,对输入的图像进行灰度化、二值化、滤波去噪等预处理操作,以提高中文及符号检测的准确性[1]。

2301_79809972的博客 1119

JVM & Spring Boot 深度解析

自定义类加载器允许开发者根据特定需求加载类。创建自定义类加载器通常需要继承类并重写findClass方法。加载特定格式的资源文件:例如,加载特定格式的配置文件或日志文件。实现模块化设计:通过自定义类加载器来加载模块中的类,实现模块之间的解耦。实现热部署:在运行时动态加载和卸载类,实现热部署功能。本文从JVM和Spring Boot两个角度,详细介绍了JVM知识体系和Spring Boot知识体系。通过本文的学习,读者可以深入理解JVM和Spring Boot的核心概念、原理和最佳实践。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1097

手把手教你用UM982搭建厘米级RTK定位系统(附避坑指南)

本文详细介绍了如何使用UM982模组搭建厘米级RTK定位系统,涵盖硬件连接、软件配置和深度优化技巧。UM982支持BDS、GPS、GLONASS和Galileo等多系统全频点信号,特别适合精准农业、无人机导航等高精度应用场景。通过实战案例和避坑指南,帮助开发者快速实现厘米级定位精度。

y7z8a的博客 1404

JVM与Spring Boot知识体系

自定义类加载器允许开发者根据特定的需求加载类。自定义类加载器通常需要实现接口,并重写findClass方法。开发者可以通过创建自定义Starter来简化依赖管理。创建Maven项目,添加Spring Boot的依赖。编写一个配置类,通过注解。使用@Bean注解创建所需的Bean。在pom.xml中添加依赖和自定义Starter依赖。在文件中添加自动配置类的信息。

AIHacksCash的博客 614

用示波器抓一次MIPI D-PHY的波形,手把手教你读懂HS模式和LP模式的切换时序

本文详细解析了MIPI D-PHY信号的双模切换机制,包括高速模式(HS)和低功耗模式(LP)的波形捕获与诊断技巧。通过示波器设置、关键状态分析和实战案例,帮助工程师快速定位信号完整性问题,提升调试效率。

weixin_30696427的博客 453

腾讯股票接口API(1)——根据股票代码获取详情

获取股票简要信息,找来找去也没有找到官方的文档,都是复制粘贴的,这里先简单记录一下。 1.简要信息 以贵州茅台为例: http://qt.gtimg.cn/q=s_sh600519 // sh600519是贵州茅台的股票代码,根据自己的关键字拼接URL 可以直接在Android项目中请求,会得到如下一串字符串: v_s_sh600519="1~贵州茅台~600519~2075.95~42.95~2.11~38930~794942~~26078.04~GP-A"; 这里v_s代表简要信息,sh600519

GeofferySun的专栏 6万+

JVM & Spring Boot 架构精髓

自定义类加载器允许开发者自定义类加载逻辑,例如,从不同的来源加载类或实现特殊的加载逻辑。自定义Starter可以帮助开发者将Spring Boot应用中的通用代码封装起来,方便其他开发者使用。自定义Endpoint允许开发者扩展Actuator的功能。

AIHacksCash的博客 836

从SOMEIP看SOA,汽车电子电器架构的转变

从SOMEIP看SOA,汽车电子电器架构的转变

天赐好车的博客 241

JVM & Spring Boot精髓

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》、(架构篇)、作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 961

基于Python的农业市场价格抓取与供需分析:现代爬虫技术与实战应用

在正式开始爬虫开发之前,我们首先了解爬虫的基本概念和工作原理。爬虫(Web Scraping)是通过编程的方式,自动从互联网上获取信息的技术。它可以帮助我们提取HTML页面中的特定数据,通常用于收集并处理大量信息。发送HTTP请求:爬虫需要向目标网站发送请求,获取网站的HTML页面内容。解析HTML页面:通过HTML解析器对获取的页面内容进行解析,提取其中需要的数据。数据清洗与存储:将提取的数据进行清洗,去除多余的字符或无关内容,然后存储到合适的格式(如CSV文件、数据库等)中。数据分析与可视化。

2201_76125261的博客 1117

2022年华为ICT大赛 全球总决赛!中文综合任务书-网络赛道真题!

2022年华为ICT大赛 全球总决赛!综合任务书-网络赛道真题-中文翻译版

君逍遥o 2402

JVM & Spring Boot详解

自定义类加载器允许开发者根据特定的需求对类加载过程进行扩展。例如,可以实现一个网络类加载器,从网络上动态加载类文件。自定义类加载器通常需要继承类或实现接口,并重写其中的findClass方法。自定义Starter可以帮助开发者将一些常用的依赖和配置封装起来,方便其他开发者使用。开发自定义Starter通常需要创建一个Maven项目,并添加必要的依赖和配置。开发者可以根据需要自定义Endpoint来扩展Actuator的功能。自定义Endpoint可以提供自定义的监控和管理信息。

MoneyHacksPro的博客 653

2026.2.11:ollama api推理GLM-OCR模型识别图片

本文介绍了使用Ollama API调用GLM-OCR模型进行图片文字识别的过程。首先通过ollama pull glm-ocr:latest命令拉取模型,然后使用Python脚本调用API接口。代码示例展示了如何发送包含图片路径的请求,并处理返回的识别结果,支持文本、公式和表格三种识别模式。运行结果展示了模型对输入图片的识别效果,为开发者提供了便捷的OCR解决方案。

拥抱具身智能,昇腾Ascend C 363

JVM/Spring Boot知识体系

类加载机制:在类加载过程中,类加载器会首先尝试从系统类路径(classpath)中查找类的定义,如果找不到,则尝试从父类加载器中查找。这个过程保证了Java程序的类加载机制的安全性。Java虚拟机中的类加载器主要有Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。类加载过程:在加载阶段,JVM会使用读取类文件,然后通过生成Class对象。在连接阶段,验证器会检查Class对象中的字节码是否安全,包括类型检查、常量池检查等。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 995

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JVM & Spring Boot 核心知识

自定义类加载器允许开发者根据特定的需求进行类加载。这可以通过继承类或实现接口来实现。继承:通过继承类,可以重写findClass方法来指定自定义的类加载逻辑。实现接口:通过实现接口,可以完全控制类加载过程,包括类文件的获取、解析和加载。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 940

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JVM & Spring Boot核心解析

开发人员可以通过继承类或实现接口中的invoke方法来创建自定义类加载器。自定义类加载器可以用于实现特定的类加载逻辑,如模块化系统。起步依赖:提供一组依赖,方便开发人员使用。依赖管理机制:使用和标签管理依赖,并通过BOM文件统一版本。版本冲突解决:通过依赖管理和版本控制,避免版本冲突。Spring Boot允许在AutoConfigurationBean的生命周期中添加扩展点,如等。

JavaCodePro的博客 958

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JVM & Spring Boot精髓解析

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》、(架构篇)、作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 701

JVM & Spring Boot 深入解析

在某些情况下,如模块化系统或插件开发,可能需要自定义类加载器来加载特定类。自定义类加载器可以通过继承类并重写findClass方法来实现。自定义Starter可以简化依赖管理,提高开发效率。自定义Starter需要创建一个包含前缀的jar包,并在其中添加文件,该文件中包含所有自动配置类的全限定名。自定义Endpoint可以扩展Actuator的功能,提供定制化的监控信息。自定义Endpoint需要实现Endpoint接口,并使用@Endpoint注解来注册端点。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 876

JVM & Spring Boot精讲

自定义类加载器允许开发者控制类的加载过程,这在实现热部署、模块化、资源隔离等方面非常有用。自定义类加载器需要实现接口。类路径定位:通过重写findClass方法来定位类文件。资源读取:通过重写和方法来读取资源文件。类转换:通过重写asSubclass方法来处理子类加载。自定义Starter可以帮助开发者快速集成第三方库。起步依赖:定义了Starter的依赖关系,通过Maven或Gradle的方式管理。依赖管理机制:通过BOM文件(Bill of Materials)管理依赖版本,解决版本冲突。

AIHacksCash的博客 1078

JVM与Spring Boot解析

自定义类加载器允许开发者在特定的类加载场景下,实现自己的类加载逻辑。例如,实现URL类加载器,用于从特定的URL加载类。自定义Starter可以帮助我们快速集成第三方库。例如,我们可以创建一个名为my-starter的Starter,将第三方库的依赖添加到Starter的pom.xml文件中,并提供一个自动配置类。自定义Endpoint允许我们扩展Actuator的功能。例如,我们可以创建一个自定义的Endpoint,用于获取应用的特定信息。

JavaCodePro的博客 835

Java JVM & Spring Boot 核心解析

Spring Boot允许开发者创建自定义Starter,以便将库的依赖和配置封装在一起。Starter的创建:自定义Starter通常包含以下组件:一个Maven项目、一个或多个jar依赖、一个或多个配置类、一个或多个自动配置类。Starter的配置:自定义Starter的配置通常使用Spring Boot的自动配置机制,根据依赖关系自动配置Bean。

AIHacksCash的博客 726
上一篇: JVM类加载机制详解
下一篇: Spring MVC深度解析
Java廖志伟
博客等级 码龄2年 3609粉丝 1517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值