JVM与Spring Boot精讲

磁传感器技术解析:从霍尔效应到车规级应用,纳芯微的本土第一之路 磁传感器是现代工业与汽车电子中的关键感知元件,其技术演进经历了从分立器件到高集成度SoC的跨越。霍尔效应与磁阻效应构成两大物理基础,其中硅基霍尔方案凭借高性价比与成熟供应链,在车规级应用中占据主流。高精度电流检测、角度与位置感知、磁开关等场景,对传感器的温漂抑制、共模瞬态抗扰与批量一致性提出严苛要求。车规级可靠性体系与系统级集成能力,成为衡量供应商的核心标尺。随着新能源主驱、光伏逆变、工业伺服等应用爆发,具备完整信号链与隔离技术积累的厂商正逐步构建护城河。本文以纳芯微为样本,剖析其从隔离技术延伸至磁传感器平 阅读详情

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

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

一、JVM知识体系

JVM(Java虚拟机)是Java语言运行时环境的核心,它负责将Java代码编译成字节码,并在运行时解释或即时编译这些字节码。以下是JVM知识体系中的关键知识点:

类加载机制

类加载机制是JVM的重要组成部分,负责将Java类文件加载到JVM中。这个过程分为三个阶段:加载、连接和初始化。

类加载过程
  1. 加载:查找并加载指定名称的类或接口的.class文件。在加载过程中,JVM会执行以下操作:

    • 加载类文件数据,包括类的二进制数据、常量池、静态变量等信息。
    • 创建一个代表类的java.lang.Class对象。
  2. 连接:验证类文件信息,准备类在JVM中的运行环境。连接过程包括:

    • 验证:确保类文件的字节码是有效的,并且遵循JVM规范。
    • 准备:为类变量分配内存,并设置默认初始值。
    • 解析:将符号引用转换为直接引用。
  3. 初始化:执行类构造器 ()方法,为静态变量赋值。初始化过程发生在类加载之后,但类使用之前。

双亲委派模型

双亲委派模型是JVM中类加载器的一种层次结构,它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。当一个类加载器请求加载一个类时,它首先将请求委派给父类加载器,只有当父类加载器无法完成这个请求时,才自己去加载。这种模型的优点是:

  • 避免类的重复加载。
  • 确保Java核心API的稳定。
自定义类加载器

自定义类加载器允许开发者控制类的加载过程,这在模块化系统和插件式开发中非常有用。例如,可以通过自定义类加载器实现以下功能:

  • 加载特定于应用程序的类。
  • 加载外部库或框架的类。
  • 加载特定格式的类文件。

模块化系统(JPMS)

Java Platform Module System(JPMS)是Java 9引入的一个模块化系统,它将JVM和Java应用程序组织成模块,以提供更好的隔离性和灵活性。模块化的主要优势包括:

  • 隔离:模块之间相互独立,降低了依赖性。
  • 依赖管理:模块可以声明其依赖项,JVM可以自动解析和加载。
  • 可扩展性:模块可以按需添加或删除,提高了系统的可维护性。

内存模型

JVM的内存模型包括以下部分:

  1. 运行时数据区:
    • 堆:所有线程共享的内存区域,用于存放几乎所有的对象实例和数组的实例。堆内存的分配和回收由垃圾回收器管理。
    • 栈:每个线程都有自己的栈,用于存储局部变量和方法调用。栈内存的分配和回收由线程本身管理。
    • 方法区:存储已被虚拟机加载的类信息、常量、静态变量等数据。方法区是持久内存,不受垃圾回收器管理。
    • PC寄存器:每条线程都有一个程序计数器,用于指示下一条要执行的指令。PC寄存器是线程专有的,不受垃圾回收器管理。
内存溢出场景分析
  • 堆溢出:当创建的对象太多,超过堆的容量时,会导致Java虚拟机抛出OutOfMemoryError异常。解决方法包括:

    • 增加堆内存大小。
    • 优化代码,减少对象创建。
    • 使用对象池等技术。
  • 栈溢出:当方法调用太深,超过栈的深度时,会导致Java虚拟机抛出StackOverflowError异常。解决方法包括:

    • 优化代码,减少递归调用。
    • 增加栈内存大小。
  • 方法区溢出:当类定义过多,超过方法区的容量时,会导致Java虚拟机抛出OutOfMemoryError异常。解决方法包括:

    • 使用大对象内存(Metaspace)。
    • 优化代码,减少类定义。

垃圾回收

垃圾回收(GC)是JVM自动管理内存的重要机制。垃圾回收器通过回收不再使用的对象来释放内存。以下是垃圾回收的主要原理和算法:

GC Roots可达性分析

GC Roots是垃圾回收的起点,任何不可达的对象都将被回收。GC Roots通常包括:

  • 栈中的引用变量。
  • 方法区中的静态变量。
  • 方法区中的常量池。
分代收集理论

JVM将内存分为不同的代,如新生代(Young)、老年代(Old),以优化垃圾回收效率。不同代的对象具有不同的生命周期和回收策略。

  • 新生代:用于存放新创建的对象。新生代采用复制算法进行垃圾回收,效率较高。
  • 老年代:用于存放长时间存活的对象。老年代采用标记-清除或标记-整理算法进行垃圾回收。
引用类型
  • 强引用:最常见的引用类型,垃圾回收器无法回收被强引用关联的对象。
  • 软引用:可以回收,但只有在内存不足时才会被回收。
  • 弱引用:可以回收,垃圾回收器会尝试回收,但不是必须的。
  • 虚引用:没有任何实际引用,垃圾回收器回收时,将返回null。
垃圾回收算法
  • 标记-清除:分为标记和清除两个阶段。首先标记所有可达对象,然后清除未被标记的对象。
  • 复制:将内存分为两块,每次只使用其中一块,当这块用完时,将存活的对象复制到另一块,然后清空原来的块。
  • 整理:在复制算法的基础上,对内存进行整理,以提高内存利用率。
并发收集器
  • CMS(Concurrent Mark Sweep):一种以减少停顿时间为目标的收集器。CMS在垃圾回收过程中,会尽量减少对用户线程的干扰。
  • G1(Garbage-First):一种面向服务端应用的收集器,旨在提供可控的停顿时间。G1将堆内存划分为多个区域,优先回收垃圾最多的区域。
  • ZGC(Z Garbage Collector):一种低延迟的垃圾回收器。ZGC通过减少内存扫描和垃圾回收过程中的锁竞争,实现低延迟的垃圾回收。
停顿时间控制策略

JVM提供了多种策略来控制垃圾回收的停顿时间,如G1的停顿时间目标(STW)。

性能调优
  • JVM参数配置:通过设置Xms、Xmx等参数来调整堆内存大小。
  • 内存泄漏诊断:使用工具如VisualVM或JProfiler来诊断内存泄漏。
JIT编译优化

JIT编译器可以将字节码即时编译成本地机器码,以提高程序运行效率。JIT编译器通过以下步骤进行优化:

  • 分析:分析字节码,识别热点代码。
  • 优化:对热点代码进行优化,提高代码执行效率。
  • 编译:将优化后的代码编译成本地机器码。

二、Spring Boot知识体系

Spring Boot是一个开源的框架,它简化了Spring应用的初始搭建以及开发过程。

自动配置

Spring Boot的核心特性之一是自动配置,它可以根据添加的jar依赖自动配置Spring应用程序。自动配置的实现原理如下:

  1. 自动配置类:Spring Boot提供了一个名为spring.factories的文件,其中包含了所有自动配置类的信息。
  2. 条件化配置:自动配置类会根据添加的jar依赖和配置信息进行条件化配置,只有满足条件的自动配置类才会生效。
@EnableAutoConfiguration原理

@EnableAutoConfiguration注解通过类路径下是否有某个类存在来决定是否启用自动配置。当@EnableAutoConfiguration注解被添加到应用程序的入口类中时,Spring Boot会扫描类路径下的jar依赖,并根据spring.factories文件中的信息自动配置相应的组件。

条件化配置(@Conditional)

Spring Boot使用条件化配置来根据不同的条件启用或禁用某些配置。条件化配置的原理如下:

  1. 条件注解:Spring Boot提供了多种条件注解,如@ConditionalOnClass、@ConditionalOnMissingBean等。
  2. 条件匹配:当自动配置类或Bean定义时,Spring Boot会根据条件注解进行条件匹配,只有满足条件的配置才会生效。
自定义Starter开发

自定义Starter可以帮助开发者将库或组件打包成可重用的模块。自定义Starter的开发步骤如下:

  1. 创建一个Maven项目,并添加Starter的依赖。
  2. 创建一个自动配置类,并使用@ConditionalOnClass注解指定依赖。
  3. 创建一个Starter POM文件,将自动配置类和依赖打包成jar包。

起步依赖

起步依赖(Starters)是Spring Boot提供的依赖管理机制,它们将一组相关的库打包在一起。起步依赖的使用方法如下:

  1. 在pom.xml文件中添加起步依赖的依赖项。
  2. Spring Boot会自动解析依赖项,并添加相应的库到类路径中。
依赖管理机制(BOM文件)

BOM(Bill of Materials)文件用于定义项目依赖的版本,以确保所有依赖的版本一致性。BOM文件可以确保项目中的所有依赖都使用相同的版本,避免了版本冲突。

版本冲突解决

Spring Boot通过提供统一的版本管理来减少版本冲突。当项目添加新的依赖项时,Spring Boot会自动解析依赖项之间的版本冲突,并选择合适的版本。

第三方库集成模式

Spring Boot支持多种第三方库的集成,如数据库连接池、缓存等。集成第三方库的步骤如下:

  1. 在pom.xml文件中添加第三方库的依赖项。
  2. 在Spring Boot应用程序中配置第三方库。

Actuator

Spring Boot Actuator提供了一系列端点,用于监控和管理Spring Boot应用程序。Actuator的端点包括:

健康检查端点

健康检查端点允许开发者检查应用程序的健康状态。健康检查端点可以返回应用程序的健康状态、运行时信息等。

度量指标收集

Actuator可以收集应用程序的度量指标,如内存使用情况、线程信息等。收集到的度量指标可以用于监控和分析应用程序的性能。

自定义Endpoint开发

开发者可以自定义端点来扩展Actuator的功能。自定义端点的开发步骤如下:

  1. 创建一个Endpoint类,并实现Endpoint接口。
  2. 在Spring Boot应用程序中配置自定义端点。

配置文件管理

Spring Boot使用配置文件来管理应用程序的配置。配置文件可以是.properties文件、.yml文件或.xml文件。Spring Boot支持以下配置文件格式:

多环境配置(application-{profile}.yml)

Spring Boot支持多环境配置,允许开发者根据不同的环境(如开发、测试、生产)使用不同的配置文件。多环境配置的原理如下:

  1. 在配置文件中添加特定环境的配置信息。
  2. 在启动Spring Boot应用程序时,指定环境参数。
配置加载优先级

Spring Boot会按照一定的优先级加载配置文件。优先级顺序如下:

  • 命令行参数
  • JVM系统属性
  • 命令行属性
  • 配置文件
动态配置刷新

Spring Boot支持动态刷新配置,以便在运行时更新配置。动态配置刷新的原理如下:

  1. 监听配置文件的变化。
  2. 当配置文件发生变化时,重新加载配置。

监控与日志

Spring Boot集成了多种监控和日志框架,如Micrometer和Logback/SLF4J。

Micrometer集成

Micrometer是一个度量指标收集库,它支持多种度量指标的后端。Micrometer可以用于收集应用程序的性能数据,如内存使用情况、线程信息等。

Logback/SLF4J配置

Spring Boot默认使用Logback作为日志框架,它提供了丰富的配置选项。Logback的配置文件可以是.xml文件或.json文件。

分布式链路追踪

Spring Boot支持分布式链路追踪,如Zipkin和Jaeger。分布式链路追踪可以帮助开发者追踪分布式系统中的请求路径,分析系统性能问题。

扩展机制

Spring Boot提供了多种扩展机制,如自定义AutoConfigurationBean和生命周期扩展点。自定义扩展机制的原理如下:

  1. 创建一个自定义Bean,并实现相应的接口。
  2. 在Spring Boot应用程序中配置自定义Bean。

响应式编程支持

Spring Boot支持响应式编程,通过Spring WebFlux框架实现。响应式编程可以帮助开发者构建高并发、高并发的应用程序。

通过以上对JVM和Spring Boot知识体系的详细描述,我们可以看到这两个技术是如何相互关联和影响的。JVM为Java应用程序提供了运行时环境,而Spring Boot则是在这个环境中构建应用程序的框架。理解JVM的内存模型和垃圾回收机制对于优化Spring Boot应用程序的性能至关重要。同时,Spring Boot的自动配置和模块化特性使得开发人员可以更高效地构建和维护Java应用程序。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

- 💂 博客主页: Java程序员廖志伟
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号: SeniorRD

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

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

USB 基础学习:USB 电气信号介绍 USB电气信号技术解析 USB通信的核心是差分信号传输技术,通过D+和D-两根线传输相位相反的电压信号实现数据通信。USB信号系统包含三类关键信号:差分数据信号(抗干扰性强)、单端状态信号(用于设备识别)和电源信号(提供5V供电)。USB2.0采用400mV电压摆幅和NRZI编码,支持低速(1.5Mbps)至高速(480Mbps)传输;USB3.0则新增专用差分对,数据速率可达20Gbps。物理层通过上拉/下拉电阻检测设备连接,高速模式需特殊握手协议。抗干扰设计的关键在于保持差分线等长、阻抗匹配和使用共模扼 阅读详情

相关推荐

从零构建AI Agent集群:Docker Compose与Nginx部署实战

在AI应用开发领域,微服务架构和容器化部署已成为提升开发效率和系统可维护性的关键技术。Docker Compose作为容器编排工具,能够将多个独立服务(如Node.js、Python应用)及其依赖(数据库、缓存)封装在隔离环境中,并通过统一配置文件定义服务间的网络与依赖关系,实现一键启停。Nginx作为反向代理,则提供了统一的网络入口、请求路由和负载均衡能力,是构建高可用Web应用的基石。这种组合技术方案的价值在于,它能将复杂的AI系统(如工作流引擎、对话Agent、技能库)的部署运维复杂度大幅降低,使得开

weixin_27028523的博客 638

JVM & Spring Boot精讲

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

AIHacksCash的博客 1078

防止加入域主机脱离域的控制(管理员权限)

一、简介   当公司所有主机加入到域后,SA首要工作就是防止加入域的主机脱离域的控制。让我发现该工作的必要性是一程序猿,前一天刚配完禁止执行QQ、微信执行,第二天就看到那家伙在用微信聊天,肯定是用回旧的本地账号登陆了。   本人所在公司安装软件的类型繁杂,无管理员权限运行不少软件会报错,不得不授予「域账号」本地管理员权限。过大的权限带也来了一系列后果:用户可随意退出域、创建本地管理员...

der69615的博客 3173

JVM与Spring Boot知识精讲

自定义类加载器允许开发者实现自己的类加载逻辑,例如,从特定的文件系统、网络或数据库加载类。自定义类加载器需要继承自java.lang.ClassLoader类,并重写findClass方法。

JavaCodePro的博客 778

即梦AI使用教程

摘要: 即梦AI是字节跳动推出的多模态AI创作平台,整合图片、视频、智能编辑功能,基于OmniHuman模型支持中英日三语操作。核心特点包括: 技术升级:4.0版本强化中文语义理解与微观表现力,新增故事分镜生成; 创作功能:支持文本/图片转视频、AI对口型、商业级抠图与多图层融合; 用户友好:移动/网页双端适配,灵感社区复用提示词,剪映生态无缝衔接; 应用场景:覆盖电商换装、虚拟主播、设计融合等需求,未来将开放API拓展生态。 (字数:149)

专业深耕,技术前沿 6296

在 Ubuntu 22.04 上配置 SonarQube 与 CI/CD 流水线实现自动化代码审查

本文详细介绍了在Ubuntu 22.04系统上配置SonarQube并与CI/CD流水线集成的完整流程,实现自动化代码审查。从环境准备、数据库配置到核心参数调优,再到与Jenkins和GitHub Actions的深度集成,提供了实战技巧和性能优化建议,帮助团队提升代码质量监控效率。

weixin_28829325的博客 258

Java JVM & Spring Boot精讲

自定义类加载器允许开发者控制类的加载过程,这在模块化系统(JPMS)中非常有用。开发者可以通过继承类或实现接口来创建自定义类加载器。自定义Starter可以简化依赖管理,提高项目的可重用性。创建Starter:创建一个包含所有必需依赖的jar包。添加依赖:在Starter的pom.xml文件中添加所有必需的依赖。添加自动配置:在Starter中添加自动配置类,自动配置与Starter相关的Bean。自定义Endpoint允许开发者添加自定义的端点,提供额外的监控信息。实现Endpoint接口:实现。

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

2025年GESP3月认证C++五级真题解析

小 A 有 2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i 件物品,小 B 会以 bi 的价格购买,而小 C 会以 ci 的价格购买。对于所有测试点,保证 1 <= T <= 100, 2 <= g < p <= 10^9, g, p 为整数, p 为质数。对于所有测试点,保证 1 <= n <= 10^5, 0 <= bi, ci <= 10^9, bi, ci 为整数。对于另外 50 % 的测试点,保证 n <= 100000, 0 <= bi, ci <= 10^9。

lan_in的博客 1035

JVM & Spring Boot知识精讲

在实际应用中,有时需要自定义类加载器来加载特定的类,如模块化系统(JPMS)。自定义类加载器可以通过继承类或实现接口来实现。在自定义类加载器中,可以重写findClass方法来加载特定的类文件。自定义Starter可以让其他开发者更容易地使用你的库。创建Maven项目,添加Spring Boot依赖。编写自动配置类,实现自动配置逻辑。编写Starter POM,将自动配置类和依赖打包成Starter。发布Starter到Maven中央仓库。

AIHacksCash的博客 981

YOLO11-Seg优化:注意力魔改 | 具有切片操作的SimAM注意力,魔改SimAM

问题点:SimAM计算整张特征图的像素差平均值时加权可能会忽略小目标的重要性,同时与整体平均值相比可能和背景信息相似,导致加权增强较弱;

会AI的学姐 457

基于STM32设计的智能水产养殖系统(华为云IOT)(152)

当前设计的智能水产养殖系统主控芯片采用STM32F103RCT6,可以实现对水位、水温、水混浊度和PH值等参数的监测和控制,并且支持定时投喂功能。通过连接华为云物联网平台,将传感器数据上传到服务器,并通过Qt设计的Android手机APP来获取设备上传的数据,从而实现对养殖环境的远程监测和控制。

8824

Java秋招突击:高频考点与实战策略精讲

在Java后端开发领域,掌握核心原理是构建高性能、高可用系统的基石。理解JVM内存模型、垃圾回收机制、并发编程模型以及数据库事务与索引原理,是每一位开发者必须跨越的技术门槛。这些底层知识不仅决定了代码的执行效率,更直接关系到系统的稳定性和扩展性。从技术价值来看,深入理解Java并发中的AQS同步器框架和synchronized锁升级机制,能够帮助开发者编写出更安全、高效的多线程程序;而精通MySQL的B+树索引结构与事务隔离级别,则是进行数据库性能优化和保证数据一致性的关键。在实际应用场景中,无论是应对高并

weixin_34396103的博客 385

如何在 DevOps 管道中实现 AI?

AI与DevOps的融合(AIOps)正在重塑软件开发生命周期。本文系统阐述了AI在DevOps中的五大应用场景:智能监控、自动化测试、安全防护、CI/CD优化和事件管理,并提出了六步实施框架:痛点识别、工具选型、流程集成、智能监控、MLOps和治理合规。通过Netflix、Google等企业的实践案例,验证了AI在提升部署效率(降低40%故障率)、缩短问题解决时间(MTTR减少60%)方面的显著价值,同时指出数据质量、模型偏差等实施挑战。研究表明,战略性地

介绍AWS Azure GCP devops Terraform 等技术 497

JVM与Spring Boot解析

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

JavaCodePro的博客 835

深度学习工具包 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")

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JVM与Spring Boot深度解析

开发者可以通过继承类或实现接口来创建自定义类加载器。自定义类加载器可以用于实现特定的类加载逻辑,例如实现热部署功能。自定义Starter可以提供项目所需的依赖和自动配置。创建一个Maven项目,添加必要的依赖。编写文件,定义自动配置类。编写自动配置类,实现自动配置逻辑。打包Starter为jar包。自定义Endpoint可以扩展Actuator的功能,例如添加自定义的健康指标、度量指标等。通过自定义@Bean的生命周期扩展点,可以扩展Spring Boot的自动配置功能。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JVM与Spring Boot详解

Java虚拟机(JVM)是Java程序的运行环境,它负责将Java字节码转换为机器码,实现跨平台运行。JVM的这种设计允许Java程序在任意硬件和操作系统上运行,只要存在对应的JVM实现。JVM由以下几个主要部分组成:类加载器、运行时数据区、执行引擎、本地库接口和垃圾回收器。类加载器负责将Java源代码编译成的.class文件加载到JVM中,这个过程称为类加载。运行时数据区是JVM在运行过程中使用的内存区域,包括方法区、堆、栈、程序计数器、本地方法栈等。

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值