JVM & Spring Boot精髓解析

纯JS实现SM3加密算法(兼容IE浏览器) 纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。 阅读详情

📕我是廖志伟,一名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程序运行的基础环境,其核心功能是将Java字节码转换为机器码执行。JVM知识体系涵盖了从类加载到垃圾回收的整个生命周期,下面将详细阐述其技术实现细节。

类加载机制

  1. 加载:JVM在运行时,通过类加载器将类文件从文件系统加载到方法区。加载过程涉及以下步骤:

    • 解析类文件:读取类文件中的元数据,如类名、字段、方法等。
    • 校验类文件:确保类文件符合Java虚拟机规范,无安全问题。
    • 准备:为类中的静态变量分配内存,并设置初始值。
    • 解析:将符号引用转换为直接引用,如将方法区的符号引用转换为指向方法的指针。
  2. 连接:连接过程包括以下步骤:

    • 验证:确保类文件符合Java虚拟机规范,如检查字节码指令、数据类型等。
    • 准备:为类中的静态变量分配内存,并设置初始值。
    • 解析:将符号引用转换为直接引用。
    • 初始化:执行类的初始化代码,如静态代码块等。

双亲委派模型

双亲委派模型是JVM类加载机制的一个重要特点,它规定在加载类时,首先委托父类加载器进行加载。这种模型的实现细节如下:

  • 获取父类加载器:子类加载器通过反射获取其父类加载器。
  • 委派请求:子类加载器将类加载请求委派给父类加载器。
  • 父类加载器处理:父类加载器处理委派的请求,如果无法加载,则返回null。
  • 子类加载器尝试加载:子类加载器尝试加载类,如果父类加载器返回null,则直接从文件系统加载。

自定义类加载器

自定义类加载器可以实现对类加载过程的定制化处理。其实现细节如下:

  • 继承自ClassLoader类:自定义类加载器需要继承ClassLoader类,并重写findClass方法。
  • findClass方法:在findClass方法中,实现自定义的类加载逻辑,如从特定的路径加载类文件。
  • 注册自定义类加载器:将自定义类加载器注册到JVM中,以便JVM在加载类时使用。

模块化系统(JPMS)

Java Platform Module System(JPMS)是Java 9引入的一种模块化系统,它将JVM的类加载机制与模块化设计理念相结合。JPMS的实现细节如下:

  • 模块定义:模块通过module-info.java文件定义,其中包含模块的名称、依赖关系、导出包等信息。
  • 模块解析:JVM在运行时解析模块依赖关系,确保模块之间的正确加载。
  • 模块加载:JVM根据模块定义加载模块,并将模块中的类加载到方法区。

内存模型

JVM的内存模型包括运行时数据区和内存溢出场景分析两部分。

运行时数据区

  1. 栈:栈是线程私有的数据结构,用于存储局部变量和部分运算结果。栈的内存分配和回收由JVM自动管理。

  2. 堆:堆是所有线程共享的数据结构,用于存储对象实例和数组。堆的内存分配和回收由垃圾回收器管理。

  3. 方法区:方法区存储类信息、常量池和静态变量。方法区的内存分配和回收由JVM自动管理。

  4. PC寄存器:PC寄存器存储当前线程所执行的指令地址。PC寄存器由JVM自动管理。

内存溢出场景分析

  1. 堆内存溢出:当对象实例过多,占用过多堆内存时,会发生堆内存溢出。解决方法包括:

    • 优化对象创建:减少对象实例的数量,如使用对象池。
    • 增加堆内存:调整JVM参数,增加堆内存大小。
  2. 方法区溢出:当类信息过多,占用过多方法区内存时,会发生方法区溢出。解决方法包括:

    • 优化类加载:减少类信息数量,如使用类加载器缓存。
    • 增加方法区内存:调整JVM参数,增加方法区内存大小。
  3. 栈溢出:当递归调用深度过深,占用过多栈内存时,会发生栈溢出。解决方法包括:

    • 优化递归算法:减少递归调用深度。
    • 增加栈大小:调整JVM参数,增加栈大小。

直接内存管理

直接内存管理是指JVM直接分配一块内存空间,用于存储数据,与堆内存无关。这种内存管理方式可以减少垃圾回收的负担。其实现细节如下:

  • DirectByteBuffer类:JVM提供了DirectByteBuffer类,用于创建直接内存。
  • 内存分配:通过调用allocateDirect方法,分配直接内存空间。
  • 内存回收:通过调用cleaner方法,回收直接内存空间。

垃圾回收

垃圾回收是JVM自动回收不再使用的对象所占用的内存空间的过程。垃圾回收主要包括以下两个步骤:

  1. GC Roots可达性分析:从GC Roots开始,遍历所有可达对象,确定哪些对象需要回收。

    • GC Roots:GC Roots包括方法区中的静态变量、线程栈中的局部变量等。
    • 遍历可达对象:从GC Roots开始,遍历所有可达对象,确定哪些对象需要回收。
  2. 分代收集:将对象分为新生代(Young)和老年代(Old),针对不同代采取不同的回收策略。

    • 新生代:新生代用于存储新创建的对象,回收策略包括复制算法、标记-清除算法等。
    • 老年代:老年代用于存储长期存活的对象,回收策略包括标记-清除算法、标记-整理算法等。

引用类型

引用类型包括强引用、软引用、弱引用和虚引用。不同引用类型对对象的生命周期有不同的影响。

  • 强引用:强引用是最常见的引用类型,它确保对象在内存中不会被回收。
  • 软引用:软引用在内存不足时会被回收,但不是必须回收。
  • 弱引用:弱引用在内存不足时会被回收,但回收时机比软引用更早。
  • 虚引用:虚引用在内存不足时会被回收,但回收时机比弱引用更早。

垃圾回收算法

垃圾回收算法主要包括标记-清除、复制和整理算法。这些算法在垃圾回收过程中起到关键作用。

  • 标记-清除算法:先标记所有可达对象,然后清除未被标记的对象。
  • 复制算法:将对象分为两个区域,每次只使用其中一个区域,当该区域满时,将存活对象复制到另一个区域。
  • 整理算法:在标记-清除算法的基础上,对内存进行整理,提高内存利用率。

并发收集器

并发收集器如CMS(Concurrent Mark Sweep)和G1(Garbage-First)等,可以减少停顿时间,提高JVM的性能。

  • CMS收集器:CMS收集器是一种并发标记清除算法,适用于对停顿时间要求较高的场景。
  • G1收集器:G1收集器是一种并发标记整理算法,适用于对停顿时间和内存利用率要求较高的场景。

停顿时间控制策略

停顿时间控制策略如G1的并发标记和整理过程,旨在降低停顿时间,提高用户体验。

  • 并发标记:在用户线程暂停时,进行并发标记,标记可达对象。
  • 整理过程:在用户线程暂停时,进行整理过程,回收未被标记的对象。

性能调优、JVM参数配置

性能调优是指通过调整JVM参数来提高JVM的性能。JVM参数配置包括堆内存大小(Xms和Xmx)、垃圾回收策略等。

  • 堆内存大小:调整Xms和Xmx参数,可以控制堆内存的大小。
  • 垃圾回收策略:选择合适的垃圾回收策略,如G1、CMS等。

内存泄漏诊断

内存泄漏是指程序中存在不再使用的对象,但由于引用关系无法被GC回收,导致内存占用不断增加。诊断内存泄漏的方法包括使用内存分析工具等。

  • 内存分析工具:如VisualVM、MAT等工具,可以分析内存泄漏的原因和位置。

JIT编译优化

JIT编译器可以将Java字节码编译成机器码,从而提高程序运行效率。JIT编译优化包括循环展开、内联等。

  • 循环展开:将循环体展开,减少循环的开销。
  • 内联:将方法调用替换为方法体,减少方法调用的开销。

二、Spring Boot知识体系

Spring Boot是Spring框架的一个模块,它简化了Spring应用的创建和配置过程。

自动配置

Spring Boot通过自动配置机制,根据项目依赖和配置文件自动配置Spring框架。自动配置的原理是条件化配置(@Conditional)。

@EnableAutoConfiguration原理

@EnableAutoConfiguration注解是Spring Boot自动配置的核心。它通过扫描类路径下的所有自动配置类,并根据项目依赖和配置文件自动启用相应的配置。

  • 扫描自动配置类:Spring Boot通过扫描类路径下的@ConditionalOnClass、@ConditionalOnBean等注解,找到符合条件的自动配置类。
  • 启用配置:根据项目依赖和配置文件,自动启用相应的配置。

条件化配置(@Conditional)

条件化配置允许在满足特定条件时启用或禁用配置。例如,@ConditionalOnClass注解可以指定只有当类路径下存在某个类时,才启用相应的配置。

自定义Starter开发

自定义Starter可以帮助开发者将常用的依赖和配置封装起来,方便其他开发者使用。开发自定义Starter需要创建一个Maven项目,并定义相应的依赖和配置。

  • 创建Maven项目:使用Maven创建一个新项目,并添加Spring Boot依赖。
  • 定义依赖和配置:在pom.xml文件中定义依赖和配置,如Spring Boot Starter、Spring Boot Actuator等。

起步依赖

起步依赖是Spring Boot提供的简化依赖管理机制,它将常用的依赖打包成一个jar包,方便开发者引入。

  • 起步依赖jar包:Spring Boot提供了多种起步依赖jar包,如spring-boot-starter-web、spring-boot-starter-data-jpa等。
  • 引入起步依赖:在pom.xml文件中引入起步依赖,即可使用相关功能。

依赖管理机制(BOM文件)

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

  • BOM文件:BOM文件是一个XML文件,定义了项目中所有依赖的版本信息。
  • 依赖版本一致性:BOM文件确保了项目依赖版本的一致性,避免了版本冲突。

版本冲突解决

在项目开发过程中,可能会遇到版本冲突问题。解决版本冲突的方法包括使用依赖排除、升级依赖版本等。

  • 依赖排除:在pom.xml文件中,使用 标签排除冲突的依赖。
  • 升级依赖版本:将冲突的依赖升级到最新版本。

第三方库集成模式

Spring Boot支持多种第三方库集成模式,如通过注解、配置文件等方式进行集成。

  • 注解集成:使用Spring Boot提供的注解,如@SpringBootApplication、@RestController等,集成第三方库。
  • 配置文件集成:在application.properties或application.yml文件中配置第三方库的参数。

Actuator、健康检查端点

Spring Boot Actuator提供了丰富的端点,用于监控和管理Spring Boot应用。健康检查端点可以用来检查应用的健康状态。

  • Actuator端点:Spring Boot Actuator提供了多个端点,如/health、/metrics等。
  • 健康检查端点:/health端点用于检查应用的健康状态,如数据库连接、服务可用性等。

度量指标收集

Spring Boot Actuator支持度量指标收集,可以收集应用的运行数据,如内存使用情况、线程信息等。

  • 度量指标:Spring Boot Actuator支持多种度量指标,如内存使用、线程信息、HTTP请求等。
  • 指标收集:Spring Boot Actuator通过JMX、Prometheus等协议收集度量指标。

自定义Endpoint开发

自定义Endpoint允许开发者扩展Actuator的功能,添加自定义的端点。

  • 自定义Endpoint:通过实现Endpoint接口,创建自定义的Endpoint。
  • Endpoint注册:将自定义Endpoint注册到Spring Boot Actuator中。

配置文件管理

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

  • 配置文件:Spring Boot支持多种配置文件,如application.yml、application.properties等。
  • 配置文件优先级:Spring Boot配置文件的加载优先级从高到低依次为:application.yml、application-{profile}.yml、bootstrap.yml。

动态配置刷新

Spring Boot支持动态配置刷新,允许在应用运行过程中更新配置。

  • 动态配置:Spring Boot通过Spring Cloud Config等工具,支持动态配置。
  • 配置刷新:在应用运行过程中,可以通过API或命令行工具刷新配置。

监控与日志

Spring Boot提供了丰富的监控和日志功能,如使用Micrometer集成监控、使用Logback/SLF4J配置日志等。

  • 监控:Spring Boot支持多种监控工具,如Micrometer、Prometheus等。
  • 日志:Spring Boot支持多种日志框架,如Logback、SLF4J等。

分布式链路追踪

Spring Boot支持分布式链路追踪,如使用Zipkin、Jaeger等工具实现分布式追踪。

  • 分布式链路追踪:分布式链路追踪可以追踪跨多个服务的请求,了解请求的执行过程。
  • 链路追踪工具:Zipkin、Jaeger等工具可以用于实现分布式链路追踪。

扩展机制

Spring Boot提供了多种扩展机制,如自定义AutoConfiguration、Bean生命周期扩展点等。

  • 自定义AutoConfiguration:通过实现AutoConfigurePackage、AutoConfigureImportSelector等接口,自定义AutoConfiguration。
  • Bean生命周期扩展点:通过实现BeanPostProcessor、InitializingBean等接口,扩展Bean的生命周期。

响应式编程支持

Spring Boot支持响应式编程,如使用WebFlux等框架实现异步处理。

  • 响应式编程:响应式编程可以提供更好的性能和可扩展性。
  • WebFlux:WebFlux是Spring Boot提供的响应式Web框架,支持异步处理。

通过以上对JVM和Spring Boot知识体系的详细描述,我们可以了解到这两个技术在实际开发中的应用和优势。在实际项目中,我们需要根据具体需求,合理配置和使用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

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

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

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

13.0 针对跳转不存在Activity崩溃处理,改成弹Toast提示,去掉崩溃弹窗,避免app崩溃退出 在开发过程中,在app跳转到某个没注册的Acitivity时,往往会出现崩溃的场景,这样也不好,接下来就从framework中来拦截这个崩溃,改成toast提示, 阅读详情

相关推荐

基于STM32的红外测温系统设计

为了实现本次的毕业设计,我搜集了大量的文献与资料,通过这些资料了解到红外测温的优点,与实现所需的基本器件,并设计了几个方案,最终选择了STM32作为主控芯片,为此还查阅了关于STM32的资料,在此次设计中采用的是MLX90614医用红外测温模块,通过查阅其数据手册了解其测量精度高且自带温度补偿,所以选择了该传感器作为红外测温模块,本次设计到此已经基本完成,硬件部分和软件部分的设计已基本完成。

weixin_112233的博客 1420

JVM & Spring Boot精髓

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

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

STM32--LoRa通信模块

模块根据MD0的配置与AUX引脚的状态会进入不同的功能其中在通信功能下,包含4种工作模式。

qq_47258284的博客 1万+

JVM & Spring Boot 架构精髓

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

AIHacksCash的博客 836

c++实现异步线程池并详细分析线程池析构流程

多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。

2301_76564925的博客 1598

Verilog流水线CPU设计(超详细)

快把这一篇给更了

Ace Cheney的博客 7万+

JVM与Spring Boot精髓

自定义类加载器允许开发者实现自己的类加载逻辑,以满足特定的需求。例如,可以从特定的URL加载类,或者对加载的类进行特定的处理。自定义Starter可以帮助开发者将库或框架集成到Spring Boot项目中。Maven POM文件:自定义Starter需要创建一个Maven POM文件,其中定义了项目依赖和插件。Spring Boot项目:将自定义Starter添加到Spring Boot项目中,并使用Starter注解。自定义Endpoint允许开发者创建自己的端点,以提供额外的监控和管理功能。

MoneyHacksPro的博客 835

AF自动对焦 CDAF PDAF

前言 主流的AF: CDAF, PDAF, laser assist AF(这个只是辅助,在微距或者拍摄纹理不明显的场景下好用)。 1.cdaf原理 CDAF的大致原理就是检测图像锐度或者等价于锐度的参数,不断推动马达寻找最清晰点实现合焦或者对焦。如下图: 缺点:对焦准确,速度慢,由于camera帧率,cpu处理速度,马达反映时间问题不能实时对焦运动物体。 2.pdaf原理 计算相位差,将相位差转换为相位差和af code的关系....

camerall 1万+

JVM & Spring Boot 深度解析

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

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

046篇:数据统计:分组、求和、平均值、最大最小值

本文介绍了在RPA中实现数据分组统计的方法。通过字典+循环组合,可以完成按单字段或多字段的分组聚合操作,包括求和、计数、求平均值及最大/最小值等。文章详细讲解了分组统计的原理,并提供了单级分组、多级分组的具体实现步骤,最后通过销售数据按月分组的实战案例,演示了如何从原始数据到生成汇总报表的完整流程。这些方法可以灵活应用于各类数据统计分析场景。

weixin_59649563的博客 213

AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 1万+

JVM & Spring Boot核心解析

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

JavaCodePro的博客 958

2026年经纬恒润嵌入式笔试试卷带答案

2026年经纬恒润嵌入式笔试试卷涵盖车规MCU选型(如TriCore)、Cortex-M启动流程、指针数组区别、AUTOSAR OS任务调度(静态优先级抢占)、CAN总线特性(终端电阻必要性)、PID控制原理、SOME/IP协议应用等核心知识点。试题聚焦汽车电子系统设计,强调功能安全与实时性要求,涵盖中断处理、Bootloader升级机制、内存布局及可靠性设计(如看门狗、ECC校验)。多选题考察通信协议分层应用,填空题强化基础概念(如MSP初始值、SOME/IP、积分项作用)。整体体现车载嵌入式开发对底层原

Open 75

JVM & Spring Boot 深入解析

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

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java JVM & Spring Boot 核心解析

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

AIHacksCash的博客 726

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JVM & Spring Boot深度解析

自定义类加载器允许开发者控制类的加载过程。例如,可以实现自己的类加载器来加载特定来源的类,或者实现热部署。自定义类加载器通常需要继承类,并重写方法。自定义Starter可以帮助开发者快速集成第三方库。开发自定义Starter需要创建一个Maven项目,并添加必要的依赖和自动配置。自定义Endpoint允许开发者扩展Actuator的功能,添加自定义的端点。Spring Boot允许开发者通过实现特定的接口来扩展AutoConfigurationBean的生命周期。

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java JVM & Spring Boot 深入解析

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

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 728
上一篇: Spring框架核心技术解析
下一篇: JVM与Spring Boot解析
Java廖志伟
博客等级 码龄2年 3609粉丝 1517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值