SpingBoot之替换容器为Undertow

Spring(21) 在 Spring Boot 中使用 Undertow 作为嵌入式服务器 阅读详情
AI摘要

本文介绍了Undertow容器,它是基于Java的高性能Web服务器。阐述了使用它的原因,因其在性能和内存上优于Tomcat。还说明了其特性,如支持HTTP 2.0等。详细讲解了在Spring Boot中集成Undertow的步骤,最后对比了Spring Boot下Tomcat与Undertow的性能。

什么是Undertow容器

Undertow 是一个采用 Java 开发的灵活的高性能Web服务器,提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品,是 Wildfly 默认的 Web 服务器。Undertow 提供一个基础的架构用来构建 Web 服务器,这是一个完全为嵌入式设计的项目,提供易用的构建器 API,完全向下兼容 Java EE Servlet 3.1 和低级非堵塞的处理器。

为什么使用Undertow容器

为什么要替换Undertow容器?

Tomcat默认的最大线程为200,线程数限制了请求调用的性能;在高并发场景下明显并发能力较弱,需要进行调优。

为什么不进行Tomcat参数调优?

有两个方案:进行Tomcat容器调优或者替换为性能更强的容器。可以进行Tomcat调优,但是Undertow容器在性能和内存上都优于Tomcat容器,因此直接选择Undertow容器并进行调优是更好的选择。

其实在并发量不大的情况下 Undertow、和其它两款 Servlet Web 容器 Jetty 、Tomcat 的差距并不是很大。 Undertow 的优势是高并发下的吞吐量,你可以根据自己的实际需要来选择。

SpringBoot内嵌容器支持Tomcat(默认)、Jetty、Undertow。为什么选择Undertow?

Undertow的特性

Undertow 是红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器,有以下特性:

  • 支持HTTP 2.0:Undertow 支持 HTTP/2 开箱即用,不需要重写引导类路径。

  • 支持HTTP升级:支持 HTTP 升级,允许多个协议通过 HTTP 端口上进行复用。

  • 支持WebSocket:Undertow 提供对 Web 套接字的全面支持,包括对 JSR-356 的支持。

  • 支持Servlet 4.0:Undertow 提供了对 Servlet 4.0 的支持,包括对嵌入式 Servlet 的支持,还可以混合部署 Servlet 和原生 Undertow 非阻塞处理程序。

  • 内嵌性:Undertow 可以嵌入到应用程序中,它不需要容器,只需通过 API 即可快速搭建 Web 服务器。

  • 轻量级:它是一个内嵌Web服务器,仅由两个核心jar包组成,加载一个 Web 应用可以小于 10MB 内存。

  • 高灵活性:一个 Undertow 服务器是通过链式处理器来配置的,可以根据需要添加功能,因此可以避免添加没有必要的功能。

集成Undertow容器

1. 添加依赖

在依赖中排除默认的tomcat容器依赖,添加undertow容器依赖:

  <!--web 模块 -->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
    <!--排除tomcat依赖 -->
    <exclusion>
     <artifactId>spring-boot-starter-tomcat</artifactId>
     <groupId>org.springframework.boot</groupId>
    </exclusion>
   </exclusions>
  </dependency>
  <dependency>
  <!--undertow容器 -->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-undertow</artifactId>
  </dependency>

2. 编写Undertow配置

创建undertow.properties配置文件

# Undertow 日志存放目录
server.undertow.accesslog.dir=./undertow-logs
  # 是否启动日志
server.undertow.accesslog.enabled=false
  # 日志格式
server.undertow.accesslog.pattern=common
  # 日志文件名前缀
server.undertow.accesslog.prefix=access_log
  # 日志文件名后缀
server.undertow.accesslog.suffix=log
  # HTTP POST请求最大的大小
server.undertow.max-http-post-size=0
  # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
server.undertow.io-threads=4
  # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
server.undertow.worker-threads=20
  # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
  # 每块buffer的空间大小,越小的空间被利用越充分
server.undertow.buffer-size=1024
  # 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region(已弃用)
#server.undertow.buffers-per-region=1024
  # 是否分配的直接内存
server.undertow.direct-buffers=true

下面是yaml格式的配置:

server:
  port: 9020
  http2:
    enabled: true
  undertow:
    # io-threads:IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接,默认设置每个CPU核心一个线程,不可设置过大,否则启动项目会报错:打开文件数过多。
    # worker-threads:阻塞任务线程池,当执行类似servlet请求阻塞IO操作,undertow会从这个线程池中取得线程。它的值取决于系统线程执行任务的阻塞系数,默认值是 io-threads*8
    threads:
      io: 16
      worker: 256
    # 以下配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理。
    # buffer-size:每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可
    # buffers-per-region:每个区分配的buffer数量,所以pool的大小是buffer-size * buffers-per-region
    # direct-buffers:是否分配的直接内存(NIO直接分配的堆外内存)
    buffer-size: 1024
    direct-buffers: true

参数解释:

  • io-threads:IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接,默认设置每个CPU核心一个线程,不可设置过大,否则启动项目会报错:打开文件数过多。

  • worker-threads:阻塞任务线程池,当执行类似servlet请求阻塞IO操作,undertow会从这个线程池中取得线程。它的值取决于系统线程执行任务的阻塞系数,默认值是 io-threads*8

  • buffer-size:每块buffer的空间大小,越小的空间被利用越充分,不要设置太大,以免影响其他应用,合适即可

  • buffers-per-region:每个区分配的buffer数量,所以pool的大小是buffer-size * buffers-per-region

  • direct-buffers:是否分配的直接内存(NIO直接分配的堆外内存)

3. 启动测试

Undertow启动成功提示语

[INFO ] 2020-08-13 10:38:32 [main] o.s.b.w.e.u.UndertowServletWebServer - Undertow started on port(s) 80 (http) with context path ''
复制代码

Tomcat启动成功提示语

[INFO ] 2020-08-13 10:41:35 [main] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port(s): 80 (http) with context path ''

出现undertow的提示语,则说明springboot默认启动容器已经替换为undertow容器。

Undertow的FileServer

除了采用 NIO 的方式异步处理请求,undertow还有文件服务器的功能:

import java.io.File;

import io.undertow.Handlers;
import io.undertow.Undertow;
import io.undertow.server.handlers.resource.PathResourceManager;

public class FileServer {
    public static void main(String[] args) {
        File file = new File("/");
        Undertow server = Undertow.builder().addHttpListener(8080, "localhost")
                .setHandler(Handlers.resource(new PathResourceManager(file.toPath(), 100))
                        .setDirectoryListingEnabled(true))
                .build();
        server.start();
    }
}

SpringBoot下比较Tomcat与Undertow的性能

1. 添加依赖

pom.xml配置

如果使用tomcat服务器,则配置如下:

 <dependencies>
          <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-tomcat</artifactId>
           <scope>provided</scope>
     </dependency>
 </dependencies>
复制代码

如果使用undertow服务器,则配置如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 若使用log4j2 -->
    <exclusions>
        <exclusion> 
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId> 
        </exclusion> 
    </exclusions>
</dependency>
<!-- undertow容器 -->
 <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

2. 创建容器配置文件

定制tomcat/undertow服务器相关配置:

tomcat配置

/**
 * 
 */
package com.lz.ovuola.general.util.tomcat;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * 编程方式自定义内嵌容器
 * 
 * @author deepinsea
 *
 */
@Configuration
@ConfigurationProperties(prefix = "tomcat")
public class CustomTomcatEmbeddedCustomizer {
    private int maxThreads;
    private int minSpareThreads;
    private int acceptCount;
    private int connectionTimeout;
    private String URIEncoding = "UTF-8";
    private boolean disableUploadTimeout;
    private boolean enableLookups;
    private String compression;
    private int compressionMinSize;
    private String compressableMimeType;
    /**
* 订制内嵌tomcat容器
*/
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
        factory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
        return factory;
    }
    class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer {
        public void customize(Connector connector) {
            Http11NioProtocol protocol = (Http11NioProtocol) connector
                .getProtocolHandler();
            // 设置最大连接数
            protocol.setMaxThreads(maxThreads);
            protocol.setConnectionTimeout(connectionTimeout);
            protocol.setMinSpareThreads(minSpareThreads);
            protocol.setAcceptorThreadCount(acceptCount);
            protocol.setDisableUploadTimeout(disableUploadTimeout);
            protocol.setCompression(compression);
            protocol.setCompressionMinSize(compressionMinSize);
            protocol.setCompressableMimeType(compressableMimeType);
            // connector.setURIEncoding(URIEncoding);
            connector.setEnableLookups(enableLookups);
        }
    }
    public int getMaxThreads() {
        return maxThreads;
    }
    public void setMaxThreads(int maxThreads) {
        this.maxThreads = maxThreads;
    }
    public int getMinSpareThreads() {
        return minSpareThreads;
    }
    public void setMinSpareThreads(int minSpareThreads) {
        this.minSpareThreads = minSpareThreads;
    }
    public int getAcceptCount() {
        return acceptCount;
    }
    public void setAcceptCount(int acceptCount) {
        this.acceptCount = acceptCount;
    }
    public int getConnectionTimeout() {
        return connectionTimeout;
    }
    public void setConnectionTimeout(int connectionTimeout) {
        this.connectionTimeout = connectionTimeout;
    }
    public String getURIEncoding() {
        return URIEncoding;
    }
    public void setURIEncoding(String uRIEncoding) {
        URIEncoding = uRIEncoding;
    }
    public boolean isDisableUploadTimeout() {
        return disableUploadTimeout;
    }
    public void setDisableUploadTimeout(boolean disableUploadTimeout) {
        this.disableUploadTimeout = disableUploadTimeout;
    }
    public boolean isEnableLookups() {
        return enableLookups;
    }
    public void setEnableLookups(boolean enableLookups) {
        this.enableLookups = enableLookups;
    }
    public String getCompression() {
        return compression;
    }
    public void setCompression(String compression) {
        this.compression = compression;
    }
    public int getCompressionMinSize() {
        return compressionMinSize;
    }
    public void setCompressionMinSize(int compressionMinSize) {
        this.compressionMinSize = compressionMinSize;
    }
    public String getCompressableMimeType() {
        return compressableMimeType;
    }
    public void setCompressableMimeType(String compressableMimeType) {
        this.compressableMimeType = compressableMimeType;
    }
}

或者是 undertow,测试只要启动一个就行:

undertow配置

//package com.lz.ovuola.general.util.tomcat;
//
//import io.undertow.Undertow.Builder;
//
//import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
//import org.springframework.boot.context.embedded.undertow.UndertowBuilderCustomizer;
//import org.springframework.boot.context.embedded.undertow.UndertowEmbeddedServletContainerFactory;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//@Configuration
//public class CustomUndertowEmbeddedCustomizer {
//
//  @Bean
//  public EmbeddedServletContainerFactory servletContainer() {
//  UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
//  factory.addBuilderCustomizers(new UndertowBuilderCustomizer() {
//
//  @Override
//  public void customize(Builder builder) {
//  builder.addHttpListener(8080, "127.0.0.1");
//  }
//
//  });
//  return factory;
//  }
//
// }

3. 添加启动配置参数

在application -runAs -run as configuratuion-Arguments添加:--用于jconsole或者是visualVM监控,推荐使用后者:

-Djava.rmi.server.hostname=127.0.0.1   --ip地址
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port="9093"   --端口号
-Dcom.sun.management.jmxremote.authenticate="false"

4. 使用VisualVM监控

采用visualVM监控同一个服务,分别开启tomcat/undertow容器,注意两者在application.propertites参数尽量相同,以便观察稳定性

5. 使用Jmeter压测性能

打开jemter压力测试某一接口,观察堆内存、线程数、cpu等指标。

Spring Boot 移除 Undertow:技术背景、迁移方案与避坑指南(附源码级解析) 通过源码级配置启用 Tomcat 的 NIO2 协议(异步 IO),进一步提升吞吐量:@Bean@Override// 禁用Session持久化,减少IO开销// 启用NIO2协议(异步IO),替代默认的BIO// 线程池参数优化// 禁用SSLv3/TLSv1,提升安全性// 开启TCP_NODELAY,减少延迟});Spring Boot 移除 Undertow 并非否定其技术价值,而是基于 “生态兼容性、维护成本、企业级稳定性” 的综合决策。 阅读详情

相关推荐

UnderTow服务器

Undertow通过一系列的内部机制,将原生的对象转换为Servlet规范中的和对象(其实是jAVAEE规范的),然后调用Servlet的service方法进行处理。这个过程涉及到多个类的协作,包括和等。在实际应用中,开发人员通常不需要直接处理这些转换过程,而是通过配置和部署Servlet来处理业务逻辑。类用于配置在Undertow中Servlet应用的部署相关信息。它实现了Cloneable接口,这意味着可以对这个部署配置进行克隆操作,可能在需要创建相似但略有不同的部署配置场景下会用到。

m0_62961212的博客 2981

SpringBoot中使用undertow

undertow依赖参数配置多端口监听 首先说一下undertow是个啥? undertow是一个采用Java开发的灵活的高性能web服务器。其提供包括阻塞和基于NIO的非阻塞机制。 它是红帽公司的开源产品,是一个完全为嵌入式设计的web服务器。 优点: 轻量:undertow只有几百KB,在嵌入式模式下运行,占用的堆内存也只有4MB左右 servlet兼容:完美兼容servlet3.1 Web...

meiyouya优快云的博客 9356

AI Agent Harness Engineering 创业PMF验证工具:用户满意度+留存率+业务指标监测表

在AI Agent创业的浪潮中,我们看到了无数产品如雨后春笋般涌现,但最终能够真正找到PMF并存活下来的却寥寥无几。根据CB Insights的数据,创业公司失败的首要原因(占42%)是"没有市场需求"——换句话说,就是没有找到PMF。AI Agent产品由于其特殊性(交互范式的变革、技术复杂度高、用户期望管理困难等),PMF验证变得更加具有挑战性。传统的SaaS产品PMF验证框架虽然有参考价值,但无法完全适用于AI Agent这种新型产品形态。

AI智能探索者的博客 335

SpringBoot之Undertow

前言 在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。 同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢?本文将为大家细细讲解。 SpringB...

KHOST的博客 5265

2025软考信息安全工程师真题

2025信息安全工程师软考真题

qq_40424393的博客 1708

【OpenSearch】从零到一:手把手搭建OpenSearch与Dashboard可视化平台

本文提供了一份详细的OpenSearch与Dashboard可视化平台从零搭建指南。内容涵盖环境准备、系统调优、核心服务安装配置、Dashboard部署与汉化,以及生产环境安全加固建议,帮助用户快速构建一个功能完整的搜索与分析平台。

devops8pract的博客 617

SpringBoot3.5容器替换实战指南

依赖排除要彻底:除了排除spring-boot-starter-tomcat,还要检查是否有第三方依赖间接引入 Tomcat,可通过mvn dependency:tree命令排查;避免版本冲突:不要手动指定容器版本,依赖 Spring Boot starter 的版本管理机制,否则可能导致 Servlet API 不兼容(Spring Boot3.5 对应 Servlet 6.0 规范);配置参数适配。

2501_93873871的博客 902

LoRa项目实战:手把手教你为ESP32选配和焊接天线(从PCB到信号测试)

本文详细介绍了为ESP32选配和焊接LoRa天线的全流程,包括天线选型、PCB布局设计、焊接工艺及信号测试。重点解析了PCB板载天线、导线天线和陶瓷贴片天线的适用场景与性能特点,并提供专业的焊接技巧和信号测试方案,帮助开发者优化LoRa模块的无线通信性能。

weixin_30470643的博客 395

Spingboot学习(一)

Springboot学习(一) 使用undertow容器替换tomcat maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions>...

suppiac的博客 177

MathType公式使用技巧汇总——Mathtype怎么在word中编辑公式?论文中公式有哪技巧?有哪些注意事项?论文中的公式怎么写?

如果word中到公式编号(2-1)中间的符号如下图........ .......类似与省略号的,这是手动打的空格,公式和编号的位置都是手动敲空格操作的,这种就只是使用MathType写了公式而已,格式上还是很不方便的。**如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。而第二种,是公式里面带的括号符号,他是可以随着公式结构自适应变化的。这时需要将公式插入到一行文字的某处,

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 5万+

从战略到执行:业务领先模型 BLM 的第一把钥匙「差距分析」

业务领先模型「BLM」(Business Leadership Model),俗称“别乱摸”,起源于哈佛商学院的战略理论研究,是一套完整的战略规划方法论。 后来被 IBM 发扬光大,IBM 在转型关键时期完成了对 BLM 模型的导入和创新,从此这个模型成为 IBM 中高层用于战略制定与执行联接的方法与平台。 再到后来华为花巨资引入了 BLM 模型,经过多年的应用,将其演化成了公司战略规划和落地的主要方法与流程,也因此被中国科技企业所认识和接受。 BLM 模型可以解决哪些问题? 在企业内,

产品线负责人 2401

为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow?

往期热门文章:1、《往期精选优秀博文都在这里了!》2、18个Java8日期处理的实践,太有用了!3、厉害了我的MySQL!荣获“年度数据库”称号!Oracle只能排老二!4、11张流程图...

Java后端技术 481

Open3D点云数据处理(二):读写点云,你真的会吗?

本文详细介绍了open3d加载点云、保存点云的方法,同时打印点云坐标、颜色、法向量等字段信息。

孙悟空 2604

spring boot学习笔记-第五章 Servlet容器配置

spring boot学习笔记-第五章 Servlet容器配置 文章目录spring boot学习笔记-第五章 Servlet容器配置前言一 配置修改1 修改server相关配置1.1 配置文件修改配置1.2 代码中修改配置2 注册Servlet三大组件2.1 注册Servlet2.1 注册Filter2.3 注册Listener二 替换嵌入式Servle容器1 Tomcat容器2 jetty容器3 undertow容器4 原理(以Tomcat为例)4.1 支持的servlet容器4.2 SpringBoo

wpwdm159357的博客 335

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

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

大公司为什么禁止 SpringBoot 项目使用 Tomcat?

同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内存使用方面都优于Tomcat,那我们如何使用Undertow技术呢?Tomcat是完全免费的,深受开发者的喜爱。在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。

犬小哈 102

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot 替换tomcat_Spring Boot 如何提升服务吞吐量?

Java技术栈www.javastack.cn关注阅读更多优质文章作者:lipengxs来源:https://my.oschina.net/lipengxs/blog/3162343背景生产环境偶尔会有一些慢请求导致系统性能下降,吞吐量下降,下面介绍几种优化建议。方案1、undertow替换tomcat电子商务类型网站大多都是短请求,一般响应时间都在100ms,这时可以将web容器从to...

weixin_39924674的博客 209

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

正确使用Spring boot2.x内置web应用服务器

前言 在Spring boot1.x/2.x中默认内置web应用服务器都是使用是tomcat,而tomcat应用在当今微服务以及分布式应用架构下满足不了性能设置会出现瓶颈即使做了自定义但是性能依旧不尽人意,因此我们需要进行改造。 替换内置web应用服务器 由于Spring boot1.x/2...

658

SpringBoot2.0性能优化(一)

1、项目中尽量把jvm的参数最大堆与最小堆调成一样大小2、将servlet容器变成undertow提高吞吐量 转载于:https://blog.51cto.com/xxdeelon/2346903

weixin_34102807的博客 540

springboot有什么好的方案实现 数据实时更新吗?_你还在为 SpringBoot 服务吞吐量而烦扰吗?如何提升?...

点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 The more you know who you are, and what you want, the less you let things upset you. 你越了解自己,越懂得自己想要什么,能令你沮丧的事情就越少。 每日掏心话 不要总是羡慕别人的美好,要用心经营自己的幸福。放弃了...

weixin_39846612的博客 520

Spring boot WEB开发

1.简介 使用SpringBoot; 1)、创建SpringBoot应用,选中我们需要的模块; 2)、SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来 3)、自己编写业务代码; 自动配置原理? 这个场景SpringBoot帮我们配置了什么?能不能修改?能修改哪些配置?能不能扩展?xxx xxxxAutoConfiguration:帮我们给容器中自动配置组...

weixin_42146674的博客 370

Spring Boot jar 启动错误“due to missing embeddedServletContainerFactory.bean”

最近在学习使用Spring Boot ,感觉非常方便。 代码的测试工作一般都是intellij idea里进行。 试了下使用 mvn package 打成jar包时,在cmd中使用“java -jar **.jar” 运行时报“due to missing embeddedServletContainerFactory.bean...” 错误。 经查询,主要是注解没有用对。 在Sp

mingjie1212的博客 6793

springboot中移除tomcat插件的方法

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>    <!-- 从依赖信息里移除 Tomca...

Mr_lambor的博客 1970

spring-boot-starter-undertow和tomcat的区别

什么是tomcat 在说undertow和tomcat区别之前,先说下tomcat是什么 tomcat是一个轻量级应用服务器, 是支持运行Servlet/JSP应用程序的容器,运行在jvm上,虽说是tomcat服务器,但是并不是真正的硬件,它是部署在电脑上的软件服务。 tomcat的作用 springboot内置的tomcat undertow和tomcat的区别 部署jar包和war包 ...

weixin_49456013的博客 1万+

springboot中用undertow踩坑记

场景:准备基于springboot的静态资源实现mp4资源的播放,不同版本的springboot下效果不一样,可能导致正常的资源不可用。本文测试了几个版本,也针对这种情况提出了解决建议,希望对你的工作有所帮助。 众所周知,springboot内置类web中间件,将web服务器管理权交给了容器。在使用时只需要进行申明即可。 本文实验的环境如下: windows7+JDK1.8+Eclipse+Maven3.3.9+SpringBoot2.2.x+Undertow2.2.x 一、环境准备 第一步、配置

夜郎King的博客 6万+
上一篇: 阿里,腾讯,百度等大厂都在采用的Git,据说都来脱形自这份文档
下一篇: SpringBoot集成Mybatis-Plus
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值