Java JVM & Spring Boot 深入解析

2024年Java高分面试指南横空出世!1000道面试题+300W字解析! 毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节。 阅读详情

📕我是廖志伟,一名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通过类加载器查找并加载指定名称的类或接口的.class文件。类加载器可以是启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)或应用程序类加载器(Application ClassLoader)。

  • 验证:在类加载完成后,JVM会验证类文件的有效性,确保没有违反Java语言规范的问题,如访问权限、字节码结构等。

  • 准备:为类变量分配内存并设置默认初始值。对于静态变量,JVM会在类加载阶段进行初始化。

  • 解析:将类、接口、字段和方法的符号引用替换为直接引用。

  • 初始化:执行类的初始化代码,包括静态代码块和静态变量赋值。这个过程是类加载的最后一步。

  1. 双亲委派模型

双亲委派模型是一种类加载策略,它要求子类加载器首先委托给父类加载器尝试加载类。这种模型的实现细节包括:

  • 当子类加载器请求加载一个类时,它会先询问父类加载器是否已经加载了这个类。
  • 如果父类加载器已经加载了这个类,则直接返回这个类的实例。
  • 如果父类加载器没有加载这个类,则子类加载器会尝试自己加载这个类。
  1. 自定义类加载器

自定义类加载器允许开发者根据特定需求加载类。实现自定义类加载器需要继承java.lang.ClassLoader类并重写以下方法:

  • findClass(String name):负责查找并返回指定名称的类。
  • loadClass(String name):负责将类加载到JVM中。
  1. 模块化系统(JPMS)

Java Platform Module System(JPMS)是Java 9引入的模块化系统,它通过模块定义文件(module-info.java)来声明模块的依赖关系。模块化系统的实现细节包括:

  • 模块:模块是JVM中可重用的代码单元,它通过模块定义文件声明其依赖关系。
  • 模块路径:模块路径定义了模块中包含的类文件的位置。
  • 模块版本:模块版本用于标识模块的不同版本。
  1. 内存模型

JVM内存模型包括以下运行时数据区:

  • 堆:堆是JVM中最大的内存区域,用于存储所有实例和数组对象。堆的内存分配和回收由垃圾回收器管理。

  • 栈:栈是线程私有的内存区域,用于存储局部变量和方法调用的参数。栈的内存分配和回收是自动的。

  • 方法区:方法区用于存储类信息、静态变量和常量池。方法区的内存分配和回收同样由垃圾回收器管理。

  • PC寄存器:PC寄存器存储当前线程所执行的指令地址。

  1. 内存溢出场景分析

内存溢出的常见场景包括:

  • 大对象生成:频繁创建大对象,如大数组或大数据结构,可能导致堆空间不足。

  • 循环引用:对象之间相互引用,形成循环,导致垃圾回收器无法回收这些对象。

  • 内存泄漏:资源未正确释放,如数据库连接、文件句柄等,导致内存占用不断增加。

  1. 垃圾回收

垃圾回收是JVM自动管理内存的过程。垃圾回收的实现细节包括:

  • GC Roots可达性分析:从GC Roots开始,向上遍历,判断对象是否可达,不可达的对象将被回收。

  • 分代收集理论:将内存划分为不同的区域,针对不同区域采用不同的回收策略。

  • 引用类型:包括强引用、软引用、弱引用和虚引用,不同引用类型在内存回收过程中的作用不同。

  • 垃圾回收算法:包括标记-清除算法、复制算法和整理算法。

  1. 并发收集器

并发收集器允许垃圾回收线程与应用程序线程同时运行,以降低停顿时间。并发收集器的实现细节包括:

  • CMS(Concurrent Mark Sweep):以降低停顿时间为目标,适用于响应时间敏感的应用场景。

  • G1(Garbage-First):以减少停顿时间为目标,适用于大内存场景。

  • ZGC(Z Garbage Collector):以低延迟为目标,适用于需要高并发性能的场景。

  1. 停顿时间控制策略

为了提高应用程序的性能,JVM提供了多种停顿时间控制策略,如自适应大小堆、并行垃圾回收等。

  1. 性能调优

性能调优是JVM优化的重要环节,主要包括以下方面:

  • JVM参数配置:通过调整JVM参数,如-Xms、-Xmx等,来优化内存分配策略。

  • 内存泄漏诊断:通过分析堆转储文件和线程转储文件,定位内存泄漏问题。

  • JIT编译优化:JIT编译器在运行时对字节码进行优化,以提高执行效率。

二、Spring Boot知识体系

  1. 自动配置

Spring Boot自动配置的核心原理是通过条件化配置和自动配置类来实现。实现细节包括:

  • @EnableAutoConfiguration注解:标记一个配置类,Spring Boot会自动查找并启用所有符合条件的自动配置类。

  • 条件化配置:通过@Conditional注解及其衍生注解,可以实现按需配置,例如@ConditionalOnClass、@ConditionalOnProperty等。

  • 自定义Starter:通过创建一个Starter项目,将所需的依赖和配置封装起来,方便其他项目依赖。

  1. 起步依赖

起步依赖(Starters)是Spring Boot的核心特性之一,它将常用库的依赖关系封装在一个模块中。实现细节包括:

  • 起步依赖模块:每个起步依赖模块都包含了一组预定义的依赖关系。

  • 依赖管理:Spring Boot使用Maven或Gradle进行依赖管理,其中BOM(Bill of Materials)文件用于定义项目依赖的版本信息。

  1. 依赖管理机制

Spring Boot使用Maven或Gradle进行依赖管理,其中BOM(Bill of Materials)文件用于定义项目依赖的版本信息。实现细节包括:

  • BOM文件:BOM文件定义了项目依赖的版本信息,避免版本冲突。

  • 依赖排除:通过排除依赖或升级依赖版本,可以解决Spring Boot项目中出现的版本冲突问题。

  1. 第三方库集成模式

Spring Boot支持多种第三方库集成模式,包括:

  • 依赖注入:通过Spring框架实现组件的依赖注入。

  • AOP(面向切面编程):实现横切关注点,如日志、事务管理等。

  • 数据访问:支持多种数据访问技术,如JPA、MyBatis等。

  1. Actuator

Spring Boot Actuator是一个监控和管理生产环境中的应用程序的工具集。实现细节包括:

  • 健康检查:提供端点API,用于检查应用程序的健康状态。

  • 度量指标收集:收集应用程序的性能指标,如内存使用率、CPU使用率等。

  • 自定义Endpoint开发:用户可以根据需求开发自定义的端点。

  1. 配置文件管理

Spring Boot支持多环境配置,通过配置文件名称来区分不同环境的配置。实现细节包括:

  • 配置文件名称:配置文件名称通常以application-{profile}.yml的形式存在,其中{profile}表示不同的环境,如开发环境(dev)、生产环境(prod)等。

  • 配置加载优先级:配置加载优先级为application-{profile}.yml > application.yml。

  1. 动态配置刷新

Spring Boot支持动态配置刷新,允许在生产环境中实时更新配置而无需重启应用程序。实现细节包括:

  • 动态配置端点:Spring Boot提供了动态配置端点,允许客户端实时获取和更新配置。

  • 配置更新机制:当配置更新时,Spring Boot会自动重新加载配置并更新应用程序。

  1. 监控与日志

Spring Boot集成Micrometer进行监控,集成Logback/SLF4J进行日志配置。实现细节包括:

  • Micrometer:支持多种监控系统,如Prometheus、InfluxDB等。

  • Logback/SLF4J:提供丰富的日志配置选项,如日志级别、日志格式等。

  1. 分布式链路追踪扩展机制

Spring Boot支持分布式链路追踪,如Zipkin、Jaeger等,实现跨服务跟踪。实现细节包括:

  • 链路追踪框架:Spring Boot支持多种链路追踪框架,如Zipkin、Jaeger等。

  • 链路追踪数据收集:链路追踪框架通过收集请求的上下文信息,实现跨服务跟踪。

  1. 自定义AutoConfigurationBean生命周期扩展点

用户可以通过实现自定义的AutoConfiguration类,来扩展Spring Boot的自动配置功能。实现细节包括:

  • 自定义AutoConfiguration类:通过实现AutoConfiguration接口,自定义自动配置类。

  • 生命周期扩展点:Spring Boot提供了生命周期扩展点,允许自定义自动配置类在特定生命周期阶段执行操作。

  1. 响应式编程支持

Spring Boot支持响应式编程,通过Spring WebFlux框架实现。实现细节包括:

  • Spring WebFlux:Spring WebFlux是一个基于响应式编程的Web框架,它使用Reactor库来处理异步事件。

  • 响应式编程模型:Spring WebFlux使用响应式编程模型,允许异步处理请求并返回异步响应。

总结:

本文从JVM和Spring Boot两个方面,详细介绍了相关知识点。通过对这些知识点的深入了解,可以帮助读者更好地掌握Java应用开发和优化。

优快云

📥博主的人生感悟和目标

Java程序员廖志伟

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

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

Java程序员廖志伟

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

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

从‘最速控制’到代码:深入拆解韩京清ADRC中TD跟踪器的fhan函数(含Matlab/Simulink实例) 本文深入解析韩京清ADRC中的fhan函数,从理论到代码实现,详细拆解其在Matlab/Simulink中的应用。通过分析最速控制问题和非线性TD的连续形式,揭示fhan函数在信号处理和噪声抑制中的独特优势,并提供工程实践中的参数整定和优化技巧。 阅读详情

相关推荐

告别Keil手动分区!用CubeMX+VS Code一键生成带Bootloader的STM32 OTA工程

本文详细介绍了如何利用STM32CubeMX和VS Code实现STM32 OTA工程的自动化构建,告别传统Keil手动分区的繁琐流程。通过图形化配置Flash分区、自动生成链接脚本以及实现Bootloader跳转逻辑,开发者可以高效完成远程升级功能开发,显著提升嵌入式开发效率。

weixin_33720956的博客 388

Java JVM & Spring Boot 核心解析

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

AIHacksCash的博客 726

SAP PP模块 MRP配置实战:5步完成工厂级物料需求计划激活

本文详细介绍了SAP PP模块中物料需求计划(MRP)的工厂级配置实战,通过5个关键步骤从基础环境准备到最终激活。内容涵盖SPRO后台配置、MRP控制者定义、主数据设置及核心参数调整,帮助顾问快速掌握MRP配置清单的完整流程,确保物料需求计划的高效运行。

weixin_30431445的博客 340

Java JVM & Spring Boot核心解析

自定义类加载器可以通过继承或自定义类加载器可以加载特定来源的类文件,如本地文件、网络资源等。自定义类加载器可以实现特殊的类加载逻辑,如实现类文件的加密、解密等。自定义Starter需要创建一个Maven或Gradle项目,并添加相应的依赖。在Starter项目中,需要定义一个自动配置类,用于配置Spring应用程序所需的各种组件和功能。通过实现Endpoint自定义Endpoint需要实现Endpoint接口或继承类。自定义Endpoint可以定义应用程序的端点,如。

MoneyHacksPro的博客 423

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献:《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心。

圆桌骑士的博客 7301

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

JVM & Spring Boot 深度解析

在特定场景下,如实现模块化系统或插件扩展时,需要自定义类加载器。自定义类加载器可以继承类,并重写findClass方法。通过自定义类加载器,可以实现特定的类加载逻辑,例如实现热部署功能。自定义Starter可以帮助开发者将库或模块集成到Spring Boot项目中。自定义Starter需要创建一个包含所有依赖的jar包,并使用作为前缀。可以自定义Endpoint来扩展Actuator的功能。自定义Endpoint可以提供自定义的监控和管理信息。

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

Q3D提取PCB走线RLCG参数

介绍一种提取PCB走线寄生电容和寄生电感的方法

sinat_15150363的博客 2909

Java JVM与Spring Boot深度解析

开发者可以通过继承类或实现接口来创建自定义类加载器。例如,可以创建一个URL类加载器,用于加载位于特定URL路径下的类文件。每个模块都由一个描述文件定义,其中包含了模块的名称、所需模块、导出模块、打开的包等信息。开发者可以通过创建Maven项目并添加依赖来开发自定义Starter。自定义Starter需要实现接口,并定义所需的依赖。开发者可以通过实现Endpoint接口来开发自定义端点。自定义端点可以用来提供应用程序的特定信息。开发者可以通过实现接口来自定义AutoConfigurationBean。

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

从0到1构建数据分析AI Agent:数据采集、洞察生成与报告自动化

在企业数字化转型的今天,数据分析师80%的时间被消耗在重复取数、数据清洗、报表排版等低价值劳动上,真正用于深度业务洞察和决策支持的时间不足20%。本文将从核心概念、技术原理、代码实现、落地实践全维度,教你从0到1搭建一套完整的数据分析AI Agent系统,实现「用户用自然语言提需求→Agent自动采集多源数据→AI自动挖掘业务洞察→自动生成符合业务要求的多格式报告」的全链路自动化,平均可将需求响应速度从天级压缩到分钟级,释放70%以上的分析师人力成本。

AI Python 编程之道的博客 471

ardupilot 方向余弦矩阵/旋转矩阵的理解

本节主要记录自己对ardupilot中用到的方向余弦矩阵/旋转矩阵的理解,欢迎批评指正,有些资料参考网上写的比较好的资料,免得查找资料麻烦。旋转矩阵的坐标理解:表示从旋转矩阵的下标的坐标系的坐标变换到上标表示的坐标系坐标下。旋转矩阵的坐标系理解:表示从旋转矩阵的上标的坐标系变换到下标表示的坐标系下。从旋转矩阵的投影更好理解,比如下面旋转矩阵的第一行是左边坐标系的第一维分量在右边坐标系的投影。

陌城烟雨 612

JVM & Spring Boot 深入解析

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

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

为什么先进工艺需要check那么多corner?

那么hold slack = launch clock path delay + data path delay - capture_clock_path_delay = -capture_clock_path_delay,也就是说,capture clock path delay越大,hold越难满足。而且,我们在设计的时候,一般clock频率都会过约,所以是有较大的margin的。有的foundry还会对rc的取值范围进行了约束,如cworst_T,采用的是1.5 sigma的取值范围。

芯冰乐 2084

JVM & Spring Boot核心解析

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

JavaCodePro的博客 958

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深度学习工具包 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精髓解析

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JVM与Spring Boot解析

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

JavaCodePro的博客 835

efm32 入门.pdf

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

JVM & Spring Boot深度解析

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

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

Java JVM & Spring Boot精讲

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值