JVM与Spring Boot核心技术揭秘

案例分析|一篇文章带你看懂养鸡场智慧管理系统 养鸡场智慧管理系统是为了满足现代化养鸡业对精细化管理的需求而设计的一款专业软件。随着科技的发展和农业产业的升级,传统的手工记录和管理方式已无法满足高效、准确和实时的数据跟踪需求。本软件旨在通过集成各种功能模块,帮助养鸡场主实现从鸡苗孵化、饲养管理、饲料控制到销售结算等全链条的智能化操作。该系统的核心目标是提升养鸡场的运营效率和盈利能力,通过自动化数据处理,减少人工误差,节省时间和精力。例如,孵化报表和记录模块可以帮助管理者实时监控孵化过程,及时调整策略; 阅读详情

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

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

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

Java程序员廖志伟

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

优快云

一、JVM知识体系

类加载机制

Java虚拟机(JVM)的类加载机制是Java程序能够动态扩展的关键。它不仅负责将编译后的.class文件加载到JVM中,还负责解析类定义,并确保类之间的隔离性。

技术实现细节:

  • 类加载器:JVM使用不同的类加载器来加载类,包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)。启动类加载器负责加载<JAVA_HOME>/lib目录中的类库,扩展类加载器负责加载<JAVA_HOME>/lib/ext目录中的类库,应用类加载器负责加载用户类路径(classpath)中的类。
  • 类加载过程:类加载过程包括加载、验证、准备、解析和初始化五个阶段。加载阶段负责将.class文件加载到JVM中,验证阶段确保类文件中的信息符合JVM规范,准备阶段为类变量分配内存并设置默认值,解析阶段将符号引用转换为直接引用,初始化阶段执行类字段的初始化、静态代码块和静态变量初始化。
  • 类加载器委托机制:双亲委派模型中,子类加载器首先委派给父类加载器进行类加载,只有当父类加载器无法完成加载时,才由子类加载器尝试加载。

类加载过程

类加载过程是JVM执行Java程序的第一步,它确保了类的正确加载和初始化。

技术实现细节:

  • 加载:通过java.lang.ClassLoader的findClass方法实现,将.class文件从文件系统或网络中读取到JVM中。
  • 验证:通过java.lang.ClassVerify类实现,确保类文件没有安全风险,例如没有违反JVM的访问控制要求。
  • 准备:为类变量分配内存,并设置默认值(如0、false或null)。
  • 解析:将符号引用转换为直接引用,例如将符号引用的类、接口、字段和方法的常量池中的符号引用转换为直接引用。
  • 初始化:执行类字段的初始化、执行静态代码块以及初始化类中的静态变量。

双亲委派模型

双亲委派模型是JVM中类加载机制的一个重要特性,它确保了类加载的安全性和唯一性。

技术实现细节:

  • 启动类加载器:使用原生代码实现,负责加载<JAVA_HOME>/lib目录中的核心API类库。
  • 扩展类加载器:使用Java代码实现,负责加载<JAVA_HOME>/lib/ext目录中的扩展API类库。
  • 应用类加载器:使用Java代码实现,负责加载用户指定的类路径(classpath)中的类。

自定义类加载器

自定义类加载器允许开发者扩展JVM的类加载机制,实现特定的类加载逻辑。

技术实现细节:

  • 继承java.lang.ClassLoader:通过继承ClassLoader类,并重写findClass方法,实现自定义的类加载逻辑。
  • 覆盖loadClass方法:通过覆盖loadClass方法,可以拦截类加载请求,并实现自定义的类加载逻辑。

模块化系统(JPMS)

Java Platform Module System(JPMS)是Java 9引入的一个模块化系统,它通过模块来组织代码,提高了JVM的性能和安全性。

技术实现细节:

  • 模块定义:使用module-info.java文件定义模块,包括模块名称、模块版本、模块主类、模块依赖等。
  • 模块路径:使用--module-path或-p选项指定模块路径,JVM从该路径加载模块。
  • 模块版本:通过模块版本号来管理模块的兼容性和依赖关系。

二、Spring Boot知识体系

自动配置

Spring Boot通过自动配置功能简化了Spring应用的配置过程,减少了开发者的配置工作量。

技术实现细节:

  • 自动配置原理:Spring Boot通过条件化配置、配置属性绑定、自动配置报告等方式实现自动配置。
  • 条件化配置:使用@Conditional注解和其相关注解,根据特定的条件来启用或禁用自动配置。
  • 配置属性绑定:使用@ConfigurationProperties注解将配置文件中的属性绑定到Java对象上。

@EnableAutoConfiguration原理

@EnableAutoConfiguration注解是Spring Boot自动配置的核心,它通过扫描类路径下的jar包和配置文件,自动配置相应的Bean。

技术实现细节:

  • 自动配置扫描:Spring Boot使用SpringFactoriesLoader类扫描类路径下的META-INF/spring.factories文件,找到所有实现了org.springframework.boot.autoconfigure.EnableAutoConfiguration接口的类。
  • 自动配置应用:Spring Boot根据扫描到的自动配置类,自动配置相应的Bean。

条件化配置(@Conditional)

条件化配置允许开发者根据特定的条件来启用或禁用自动配置。

技术实现细节:

  • 条件化配置类:创建一个实现了org.springframework.context.annotation.Condition接口的类,定义条件判断逻辑。
  • 条件化配置注解:使用@Conditional注解和其相关注解,将条件化配置类应用于Bean定义或组件扫描。

自定义Starter开发

自定义Starter可以帮助开发者将常用的依赖和配置封装起来,方便其他开发者使用。

技术实现细节:

  • 创建Starter项目:使用Spring Initializr创建一个Maven项目,添加spring-boot-starter依赖。
  • 添加依赖和配置:将所需的依赖和配置添加到Starter项目中。
  • 打包Starter:将Starter项目打包成一个jar包,并添加到spring.factories文件中。

起步依赖

起步依赖是Spring Boot中的一种依赖管理机制,它将相关的依赖和配置打包成一个jar包,简化了依赖管理。

技术实现细节:

  • 起步依赖定义:在pom.xml文件中,使用<dependencyManagement>标签定义起步依赖。
  • 起步依赖使用:在pom.xml文件中,使用<dependencies>标签添加起步依赖。

依赖管理机制(BOM文件)

BOM(Bill of Materials)文件是Spring Boot中依赖管理的一个重要特性,它确保了所有项目的依赖版本一致性。

技术实现细节:

  • BOM定义:在pom.xml文件中,使用<dependencyManagement>标签定义BOM文件。
  • BOM使用:在pom.xml文件中,使用<dependencies>标签添加BOM文件中的依赖。

版本冲突解决

版本冲突是依赖管理中常见的问题,Spring Boot通过提供依赖管理策略来解决版本冲突。

技术实现细节:

  • 依赖范围:通过设置依赖的范围(如compile、runtime、provided等),控制依赖的传递性。
  • 依赖排除:使用<exclusions>标签排除特定版本的依赖。
  • 依赖覆盖:使用<dependency>标签的version属性指定依赖的版本。

第三方库集成模式

Spring Boot支持多种第三方库的集成模式,包括声明式集成和编程式集成。

技术实现细节:

  • 声明式集成:使用注解和配置文件实现第三方库的集成,例如使用@EnableFeignClient注解集成Feign客户端。
  • 编程式集成:通过编写代码实现第三方库的集成,例如使用RestTemplate或WebClient进行HTTP请求。

Actuator

Spring Boot Actuator提供了健康检查、度量指标收集和自定义端点等功能,方便开发者监控和管理Spring Boot应用。

技术实现细节:

  • 健康检查:使用@HealthIndicator注解定义健康检查逻辑,Spring Boot Actuator会自动收集健康信息。
  • 度量指标收集:使用Micrometer等度量指标库收集应用性能数据,例如CPU使用率、内存使用量等。
  • 自定义端点:使用@Endpoint注解定义自定义端点,例如自定义监控数据端点。

健康检查端点

健康检查端点允许开发者检查Spring Boot应用的运行状态。

技术实现细节:

  • 健康检查逻辑:使用@HealthIndicator注解定义健康检查逻辑,Spring Boot Actuator会自动收集健康信息。
  • 健康检查结果:Spring Boot Actuator将健康检查结果存储在Health对象中,并提供RESTful API供开发者查询。

度量指标收集

度量指标收集可以帮助开发者监控应用的性能。

技术实现细节:

  • 度量指标库:使用Micrometer等度量指标库收集应用性能数据,例如CPU使用率、内存使用量等。
  • 度量指标监控:使用Prometheus、Grafana等监控工具对度量指标进行可视化监控。

自定义Endpoint开发

自定义Endpoint允许开发者扩展Spring Boot Actuator的功能。

技术实现细节:

  • 自定义Endpoint类:创建一个实现了org.springframework.boot.actuate.endpoint.Endpoint接口的类,定义自定义端点的逻辑。
  • 注册自定义Endpoint:使用@Endpoint注解注册自定义Endpoint,Spring Boot Actuator会自动将其暴露为端点。

配置文件管理

Spring Boot支持多环境配置,通过配置文件(如application-{profile}.yml)来管理不同环境下的配置。

技术实现细节:

  • 多环境配置文件:创建不同环境的配置文件,例如application-dev.yml、application-test.yml、application-prod.yml等。
  • 配置文件优先级:Spring Boot会根据配置文件的优先级来加载配置,例如优先加载application-dev.yml。

配置加载优先级

Spring Boot会根据配置文件的优先级来加载配置。

技术实现细节:

  • 配置文件位置:Spring Boot会按照以下顺序加载配置文件:file:/config/、classpath:/config/、file:/、classpath:/。
  • 配置文件优先级:位于file:/config/和classpath:/config/目录下的配置文件具有最高优先级。

动态配置刷新

Spring Boot支持动态配置刷新,允许开发者在不重启应用的情况下更新配置。

技术实现细节:

  • 配置文件变更监听:Spring Boot使用SpringCloudConfigServer或SpringBootAdmin等工具监听配置文件变更。
  • 动态配置刷新:当配置文件发生变更时,Spring Boot会自动刷新配置,并重新加载相关Bean。

监控与日志

Spring Boot提供了多种监控和日志配置选项,如Micrometer和Logback/SLF4J。

技术实现细节:

  • 监控:使用Micrometer等监控库收集应用性能数据,例如CPU使用率、内存使用量等。
  • 日志:使用Logback或SLF4J等日志库记录应用日志,例如使用Logback配置文件定义日志级别、日志格式等。

分布式链路追踪

Spring Boot支持分布式链路追踪,如Zipkin和Jaeger。

技术实现细节:

  • 链路追踪库:使用Zipkin或Jaeger等链路追踪库实现分布式链路追踪。
  • 链路追踪数据:收集应用间的调用关系和性能数据,例如请求时间、响应时间等。

扩展机制

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

技术实现细节:

  • 自定义AutoConfigurationBean:通过实现org.springframework.boot.autoconfigure.AutoConfigurationImportSelector接口,自定义AutoConfigurationBean的加载逻辑。
  • 生命周期扩展点:使用@PostConstruct、@PreDestroy等注解定义生命周期扩展点,例如在应用启动或关闭时执行特定逻辑。

响应式编程支持

Spring Boot支持响应式编程,通过Spring WebFlux等框架实现。

技术实现细节:

  • 响应式编程框架:使用Spring WebFlux等响应式编程框架实现异步编程,例如使用WebFlux处理HTTP请求。
  • 异步编程模型:使用Reactor等异步编程库实现异步编程,例如使用Reactor的Mono和Flux等类处理异步数据流。

通过以上对JVM和Spring Boot知识体系的详细解析,我们可以看到这两个技术是如何相互关联和影响的。JVM为Spring Boot提供了运行时的基础,而Spring Boot则利用JVM的特性来简化Java应用的开发和管理。在实际应用中,开发者需要根据具体需求来选择合适的JVM配置和Spring Boot特性,以达到最佳的性能和开发效率。

优快云

博主分享

📥博主的人生感悟和目标

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

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

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

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

Android Keymaster- 设备集成笔记 嵌入式 本文介绍了 Android Keymaster 的原理、使用方法和示例源代码。Android Keymaster 是一个重要的安全组件,为开发者提供了加密和解密功能,用于保护设备上存储的敏感数据。Android Keymaster 是 Android 系统的一个安全组件,用于保护设备上存储的敏感数据。Keymaster 使用基于硬件的密钥存储,同时提供了一组 API,让开发者可以在应用程序中使用这些加密功能。在嵌入式设备中,Android Keymaster 是一个重要的组件,用于提供加密和解密功能。 阅读详情

相关推荐

华为P812E光猫补全shell配置PON口模式

终于看到华为企业级的带2.5电口P812E横空出世了,相信很多发烧友也已经将此收入昂中。相信体验的同时,遇到的第一件事情就是配置PON口模式的问题,本文将带发烧基友解锁模式。

GUAIYU的博客 5727

JVM & Spring Boot核心技术揭秘

Java虚拟机(JVM)的设计理念是“一次编写,到处运行”,其核心是Java字节码解释器。JVM的运行时环境包括类加载器、执行引擎、内存管理、垃圾回收器等组件。在技术实现上,JVM通过类文件格式规范来确保字节码的兼容性和可移植性。

MoneyHacksPro的博客 440

【STC8G1K08A串口使用】

STC8G1K08A串口打印“Hello world”

m0_47459564的博客 1万+

互联网大厂Java面试揭秘:核心技术点与场景应用

在一个阳光明媚的下午,小张走进了一家互联网大厂面试室,对面坐着一位看起来非常严肃的面试官。

Elevenmao的博客 321

带硬约束的物理信息神经网络(PINN with Hard Constraint)示例及代码

本文以一个案例介绍了带硬约束的物理信息神经网络的原理及实现步骤。

m0_72768523的博客 5357

高通引导文件获取全攻略:ELF/MBN提取与EDL救砖实战

在智能手机底层维护中,引导加载程序(Bootloader)是系统启动的第一道关卡。高通平台通过PBL、SBL1/XBL等阶段完成硬件初始化和安全校验,一旦引导分区损坏,设备便可能陷入黑砖状态。此时,掌握ELF与MBN格式的引导镜像获取方法,成为维修工程师和刷机用户的核心技能。通过官方固件包解包或借助EDL模式直接从设备分区备份,均能获得原厂匹配的引导文件。配合Firehose工具和9008端口通信,即可实现分区级读写与救砖恢复。本文从启动链路原理出发,对比两种获取路径的适用场景,并针对驱动识别、文件校验、分

weixin_30175731的博客 421

互联网大厂Java面试揭秘:核心技术点与业务场景分析

Spring Cloud提供了一系列微服务架构下的服务治理、配置管理、断路器、智能路由等功能,Kubernetes则是容器编排工具,帮助实现自动化的应用部署、扩展和管理。Spring Boot通过自动配置的方式,简化了Spring应用的搭建过程,提供了内嵌的应用服务器,支持多种开发工具和框架的快速集成。在视频内容的实时分析中,可以使用Kafka进行消息的传递与处理,结合Hadoop、Spark等大数据技术进行数据的存储与计算分析。这个复杂了,可能要用大数据,还有机器学习的模型,嗯,具体就交给专业的来做吧。

weixin_46755643的博客 365

银河麒麟V10安装docker

最近在做的一个信创项目使用的操作系统是银河麒麟高级服务器V10,在安装docker时,会遇到下面的错误。 nothing provides fuse-overlayfs >= 0.7 needed by docker-ce-rootless-extras-20.10.0-3.el7.x86_64 经过分析,以下依赖包是centos系统中的包,所以需要给kylinos创建一个合适的centos源。经过实验,Kylin Linux Advanced Server V1

m0_38004228的博客 4908

JVM与Spring Boot揭秘

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

JavaCodePro的博客 734

MQTT阿里云OTA 调试记录

2.验证,这个验证是什么意思呢,就是阿里云会把你包的信息,比如包大小,streamid(相当于包的识别码),版本号发送给你的设备,然后如果你没发送升级成功的包给阿里云,这里会是一直验证中的状态,那你的设备每次重新连接阿里云,发送connect包给阿里云的时候,阿里云就会发送一次这个验证(upgrade)包。提取到了之后就可以发送请求包了,这个请求包比较坑,也可能是我没付费,他的包一次最多只有1024个字节的数据。之前说了,验证状态下,设备发送connect包给阿里云,阿里云就会发一个upgrade包给你。

qq_42585211的博客 1231

Xiaojie雷达之路---毫米波雷达基础知识---中频信号的相位

本篇文章主要介绍毫米波雷达的基础知识中的中频信号的相位 文章目录傅里叶变换的快速回顾中频信号的相位中频信号对物体微小位移的灵敏度如何2个chirps来对一个物体的速度进行测量测量一个振动的物体 傅里叶变换的快速回顾 傅里叶变换是将一个信号从时域中转换到频域中,在时域中的一个正弦信号将在频域中产生一个峰值,在大多数情况下,在频域中的一个信号是一个复数(每个值是一个振幅和相位的向量),表示为AejθAe^{j\theta}Aejθ 在频域中峰值的相位等于正弦函数的初始相位 中频信号的相位 上一篇文章中提到,

XiaoJie的博客 1万+

JVM与Spring Boot核心技术解析

开发者可以通过继承类或实现接口来创建自定义类加载器,实现动态类加载、类隔离和版本控制等功能。自定义Starter可以帮助开发者快速集成第三方库。依赖管理:在Starter中定义项目依赖。自动配置:在Starter中实现自动配置功能。自定义AutoConfigurationBean生命周期扩展点允许开发者自定义AutoConfigurationBean的生命周期,如初始化、销毁等。

AIHacksCash的博客 911

Ubuntu22.04安装ros(一键搞定)

然后发现可以一键安装,话不多说,直接终端输入如下指令。回车之后系统会自动安装ros。

m0_47313541的博客 7413

JVM与Spring Boot核心技术

自定义类加载器允许开发者实现特定的加载机制,例如实现热替换功能。实现接口:通过实现接口,可以自定义类加载器的行为。继承抽象类:通过继承抽象类,可以简化自定义类加载器的开发。自定义Starter是指开发一个jar包,用于简化项目的依赖管理。文件:包括和等。自定义Endpoint是指自定义一个端点,用于提供特定的功能。实现:通过实现接口,可以自定义Endpoint。自定义AutoConfigurationBean生命周期扩展点是指扩展AutoConfigurationBean的生命周期。实现:通过实现。

JavaCodePro的博客 768

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JVM与Spring Boot解析

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

JavaCodePro的博客 835

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值