精华内容
下载资源
问答
  • 虽然它的灵活配置和支持技术的互操作性使Apache Tomcat在许多情况下充当Web应用服务器,但Tomcat主要是Java Servlet容器。 利用Java Servlet和JSP API的实现,Tomcat能够接收来自客户端的请求,动态编译一个容器...

    虽然它的灵活配置和支持技术的互操作性使Apache Tomcat在许多情况下充当Web应用服务器,但Tomcat主要是Java Servlet容器。

    利用Java Servlet和JSP API的实现,Tomcat能够接收来自客户端的请求,动态编译一个容器管理的Java类来处理相关应用程序上下文中指定的请求,并将结果返回给客户端。这种生成动态内容的方法实现了对请求的极其快速、线程化、平台无关的处理。

    此外,由于Java Servlet规范被设计用于与所有其他主要Java Web技术的互操作性,所以托管在Tomcat服务器上的servlet能够利用Tomcat提供给它的任何资源。Tomcat的嵌套分层XML配置文件允许极其细粒度的资源访问控制,同时保持松散耦合、易于部署以及逻辑的、可读的体系结构描述。

    在本文中,我们将了解Apache Tomcat如何使用Servlets向客户机快速交付各种动态内容。

    厌倦乏味,容易出错的部署?Tcat部署包允许您通过单击将一组servlet和web应用程序部署到多个Tomcat实例。今天试试Tcat!

    1. Tomcat如何与servlet一起工作

    Servlet规范中的关键要求之一是,它们只处理整个数据事务处理的某些部分。例如,servlet代码本身永远不会侦听特定端口上的请求,也不会直接与客户机通信,也不负责管理对资源的访问。相反,这些东西是由Tomcat(servlet容器)管理的。

    这允许servlet在多种环境中被重用,或者允许组件彼此异步开发——连接器可以被重新分解,从而提高效率,而不需要对servlet代码本身进行任何更改,只要不进行重大更改。

     

    作为托管组件,servlet有一个生命周期,该生命周期从管理容器加载servlet类开始,通常是响应请求,当容器通过调用“destroy”方法关闭servlet时结束。所有servlet之间的活动被认为是其生命周期的一部分。

    在Tomcat上运行的典型servlet的生命周期可能看起来像这样:

    • Tomcat通过一个连接器接收来自客户端的请求。
    • Tomcat将此请求映射到适当的引擎进行处理。这些引擎包含在其他元素中,例如主机和服务器,这些元素限制了Tomcat搜索正确引擎的范围。
    • 一旦请求已映射到适当的servlet,Tomcat将检查该servlet类是否已加载。如果没有,Tomcat将servlet编译成Java字节码,Java字节码可由JVM执行,并创建servlet的实例。
    • Tomcat通过调用它的init方法初始化servlet。servlet包括能够读取Tomcat配置文件并相应地进行操作的代码,以及声明可能需要的任何资源,以便Tomcat能够以有序的、受管理的方式创建它们。
    • 初始化servlet之后,Tomcat可以调用servlet的服务方法来处理请求,请求将作为响应返回。
    • 在servlet的生命周期中,Tomcat和servlet可以通过使用监听器类进行通信,监听器类监视servlet的各种状态变化。Tomcat可以以各种方式检索和存储这些状态变化,并允许其他servlet访问它们,从而允许在单个或多个用户会话的跨度内由给定上下文的各种组件维护和访问状态。此功能的一个实际例子是电子商务应用程序,它记住用户添加到购物车中的内容,并能够将此数据传递到结账过程。
    • Tomcat调用servlet的销毁方法来平滑删除servlet。这个动作是由正在侦听的状态改变触发的,或者由传递给Tomcat的外部命令触发,以解除部署servlet的上下文或关闭服务器。

    构件组合

    使用servlet和它们结合静态HTML页面和JSP页面访问的资源,它们包含HTML和Java代码的混合,并且可以使用本地标记库或自定义标记调用servlet方法,Tomcat能够向用户呈现动态、安全、持久的Web应用程序。应用。

    例如,用户可以访问一个页面,其中动态用户界面对象是用Ajax、CSS和HTML5与DOM交互的客户端处理的,而用户信息是通过与servlet方法交互的JSP标签从数据库中拉取的。这允许页面的表示与任何业务逻辑完全分离,从而提高安全性和设计灵活性。

    展开全文
  • Tomcat与Servlet那些事儿

    2020-04-24 20:43:51
    Tomcat与Servlet的关系 Servlet的生命周期 Servlet如何使用 Servlet的单例多线程 ServletConfig ServletContext Request对象 Response对象 Session 前言 Tomcat是什么? Tomcat是一个运行JAVA的网络服务器。一个web...

    前言

    如有不对,欢迎指正和探讨

    Tomcat是什么?

    Tomcat是一个运行JAVA的网络服务器。一个web容器就是Servlet的容器。

    Tomcat的目录结构

    1.bin:启动和关闭tomcat的bat文件

    2.conf:配置文件

    ​ – server.xml该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)

    ​ – web.xml文件配置与web应用(web应用相当于一个web站点)

    ​ – tomcat-user.xml配置用户名密码和相关权限.

    3.lib:该目录放置运行tomcat运行需要的jar包

    4.logs:存放日志,当我们需要查看日志的时候,可以查询信息

    5.webapps:放置我们的web应用

    6.work工作目录:该目录用于存放.class文件

    Servlet是什么?

    Servlet是JAVA提供的一种用于开发网络服务的技术。可以接收网络请求并进行处理发送返回值。

    可以说只要后台是JAVA写的。你访问的所有资源都是在访问Servlet。Tomcat的欢迎页面其实也是一个默认的Servlet

    所以Servlet就是一个java类。Servlet是由服务器调用的运行在服务器端

    后面出现的控制层框架也都是以servlet为基础的

    Tomcat与Servlet的关系

    Tomcat是web容器。而servlet是java程序。servlet依赖于web容器。而Tomcat只是其中一种web容器。

    Servlet的生命周期

    Servlet的生命周期分为4个阶段

    1.当外部请求第一次访问Servlet的时候,Tomcat会负责创建Servlet实例。或者在web.xml中加上loadonstartup。则会在启动Tomcat时创建

    2.初始化init。当Servlet被实例化后,tomcat会调用init()方法初始化这个对象

    3.处理服务。当浏览器访问Servlet的时候,Servlet会调用service()方法处理请求

    4.销毁destroy(),当tomcat关闭时或者检测到Servlet要从Tomcat删除对的时候会自动调用destroy()方法,让该实例释放所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁

    Servlet如何使用

    导入servlet-api的jar文件后就可以通过实现servlet接口来编写servlet了。但是这样很麻烦。所幸HttpServlet类已经实现了Servlet接口的所有方法。编写Servlet时,只需要继承HttpServlet,然后重写你需要的方法就可以了。最后需要在web.xml中配置该Servlet的映射路径

    Servlet的单例多线程

    Servlet只会被创建一个实例,每有一个新的请求。tomcat就会分配一个新的线程去执行。所以如果要使用全局变量,需要考虑线程安全问题。尽量使用局部变量。

    ServletConfig

    此接口是用来读取web.xml中配置的初始化参数的。可以从这个对象读取出所有的配置信息

     ServletConfig config = this.getServletConfig();
    

    众所周知xml配置要比在类中配置更加灵活

    ServletContext

    ServletContext又称为Servlet的上下文。可以理解为一个全局容器(类似于Map集合)

    ServletContext context= this.getServletContext();
    

    特点:

    • 在WEB服务器启动时创建,服务器关闭时销毁

    • 一个WEB应用对应一个Servlet上下文

    • 所有的Servlet线程共享该对象。

    作用:

    • 存储一些需要共享得attribute,可以用来判断用户是否重复登录

    • 可以读取全局的初始化参数。在web.xml中的context-param配置

    Request对象

    当Tomcat容器收到Http请求时会把请求信息封装到HttpServletRequest对象中去。这个对象封装了浏览器所有的信息

    其实Request对象也可以使一个域对象。只不过它的域是这一次http请求(包括转发后)

    请求转发与重定向

    转发

    //获取到requestDispatcher对象,跳转到index.jsp
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.jsp");
    //调用requestDispatcher对象的forward()实现转发,传入request和response方法
    requestDispatcher.forward(request, response);
    

    重定向

     resp.sendRedirect(location:(转发地址));
    

    重定向也是可以带数据的,只不过只能添加在url后面以Get请求的方式。

    区别

    转发是服务器内部跳转,浏览器不知情。而重定向是告知浏览器它该去请求谁。

    转发可以传递各种对象而重定向只能在url后带字符串

    乱码问题

    post请求可以通过characterEncoding来设置字符集编码。get请求可以先通过网页编码转换为二级制数组然后再以utf8的编码形式转换为字符串。

    最后可以更改tomcat默认的编码集。(Tomcat默认iso8859)或者改为使用页面的编码集

     <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" useBodyEncodingForURI="true" />
    

    Response对象

    将需要发回用户的数据封装成一个HttpResponse对象发给服务器。服务器再响应给浏览器

    Session

    Session和Cookie都是为了保存状态而存在的。不同的是Session是保存在服务器中的。Session的过期时间默认为30分钟,但是可以自己设置

    服务器如何通过Session确定用户身份

    HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一个用户。于是乎:服务器向用户浏览器发送了一个名为JESSIONID的Cookie,它的值是Session的id值。其实Session依据Cookie来识别是否是同一个用户。

    简单来说:Session 之所以可以识别不同的用户,依靠的就是Cookie

    如果禁用了Cookie的话每一次请求服务器都会认为是新访问者从而创建一个session

    使用

    Session在用户第一次访问时创建。只要在过期时间内再次访问了的话就重新计时。并且如果同时存在的Session太多的话会按照策略进行删除。

    注意Session和Servlet不是一对一的关系。如果浏览器在一定时间内多次请求或者请求不同的Servlet是不会产生新的session的,。所以Session也可以做servlet之间的数据共享。

    所以只要浏览器不关闭,希望数据还在,就可以使用Session来保存

    场景

    可以判断用户是否登录。

    在表单中设置一个隐藏域将其中数值放入session防止重复提交。

    存储购物车中的物品

    Session和Cookie的区别

    性质 Cookie只能存储字符串,最大不超过4k,如果要存储非ASCII字符串还要对其编码。而Session可以存储任何类型的数据,可以把Session看成是一个容器。

    安全性上来说Cookie相当于是透明的。而Session相对安全。

    存储性上,session需要占服务器内存。

    有效期上,cookie可以做持久化存储。

    如果浏览器禁用了cookie的话它就没用了。但是服务器还可以通过post带上sessionid或者制作一个Token来识别用户。

    如何考虑分布式Session问题

    • Nginx ip_hash 策略,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象。

    • Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。

    • 共享 Session,服务端无状态话,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。

    展开全文
  • nio是一种IO的模型,对比传统的BIO,它可以利用较少的线程处理更多的连接从而增加机器的吞吐量,Tomcat NIO Connector是Tomcat的一种NIO连接模式。这种模式可以是的http thread 利用率更高,而无需阻塞在等待...


    nio是一种IO的模型,对比与传统的BIO,它可以利用较少的线程处理更多的连接从而增加机器的吞吐量,Tomcat NIO Connector是Tomcat的一种NIO连接模式。这种模式可以是的http thread 利用率更高,而无需阻塞在等待客户端数据准备好或者等待客户端连接等状态。只有事件触发了,才会启动线程去执行一个读写 或者 连接的任务 或者处理的任务。

    异步,前面提到他是一种通讯的方式,它跟NIO没有任务关系,及时没有NIO也可以实现异步,Servlet 3.0 Async是指Servlet 3规范以后支持了异步处理Servlet请求,我们可以把请求线程http thread 和业务线程worker thread 分开。

    Spring MVC Async是在Servlet3异步的基础上做了一层封装。

     

    具体的区别如下:

    8.1、Tomcat NIO Connector
    Tomcat的Connector 有三种模式,BIO,NIO,APR,Tomcat NIO Connector是其中的NIO模式,使得tomcat容器可以用较少的线程处理大量的连接请求,不再是传统的一请求一线程模式。Tomcat的server.xml配置protocol="org.apache.coyote.http11.Http11NioProtocol",Http11NioProtocol 从 tomcat 6.x 开始支持。NIO的细节可以参看NIO相关技术文章。

    nio 是相对于bio 来说的,nio 采用selector/epoll io模型,通过selector 监听机制,实现线程的更有效利用。 

     

    8.2、Servlet 3.0 Async
    是说Servlet 3.0支持了业务请求的异步处理,Servlet3之前一个请求的处理流程,请求解析、READ BODY,RESPONSE BODY,以及其中的业务逻辑处理都由Tomcat线程池中的一个线程进行处理的。那么3.0以后我们可以让请求线程(IO线程)和业务处理线程分开,进而对业务进行线程池隔离。我们还可以根据业务重要性进行业务分级,然后再把线程池分级。还可以根据这些分级做其它操作比如监控和降级处理。servlet 3.0 从 tomcat 7.x 开始支持。

    异步处理的优势,当页面请求服务器的接口 需要长时间处理的时候,如果只有100个线程,则100用户并发就会满了, 其他人再进来就无法响应了,但是 异步处理的思路是  100个worker线程,只是把请求接入进来,真实的处理是启动子线程处理的,等子线程处理完之后,再响应数据到客户端, 对客户端来说,都是等待相同的时间,但是对服务器来说,却可以处理更多客户请求了。

     

    8.3、Spring MVC Async
    是Spring MVC 3.2 以上版本基于Servlet 3的基础做的封装,原理及实现方式同上,使用方式如下:

    @Controller
    @RequestMapping("/async/TestController")
    public class TestController {
        @ResponseBody
        @RequestMapping("/{testUrl}")
        public DeferredResult<ResponseEntity<String>> testProcess(@PathVariable String testUrl) {
            final DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<ResponseEntity<String>>();
     
            // 业务逻辑异步处理,将处理结果 set 到 DeferredResult
            new Thread(new AsyncTask(deferredResult)).start();
     
            return deferredResult;
        }
     
        private static class AsyncTask implements Runnable {
     
            private DeferredResult result;
     
            private AsyncTask(DeferredResult result) {
                this.result = result;
            }
     
            @Override
            public void run() {
                //业务逻辑START
                //...
                //业务逻辑END
                result.setResult(result);
            }
        }

     

    展开全文
  • 2- Tomcat与高并发

    千次阅读 2018-03-16 14:36:59
    2000Linux 每个进程中的线程数不允许超过 1000在Java中每开启一个线程需要耗用1MB的JVM内存空间用于作为线程栈之用,此处也应考虑实际运用中,最大并发数硬件性能和CPU数量都有很大关系的。更好的硬件,更多的...

    操作系统对于进程中的线程数有一定的限制:

    1. Windows 每个进程中的线程数不允许超过 2000
    2. Linux 每个进程中的线程数不允许超过 1000
    3. 在Java中每开启一个线程需要耗用1MB的JVM内存空间用于作为线程栈之用,此处也应考虑
    4. 实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。

    5. 用户平均请求等待时间:
    6. 服务器平均请求处理时间:
    7. 用户平均请求等待时间主要用于衡量服务器在一定并发用户数的情况下,对于单个用户的服务质量
    8. 服务器平均请求处理时间与前者相比,则用户衡量服务器的整体服务质量,它其实就是吞吐率的倒数。

    TPS (transaction per second)   transaction  事物

     QPS(TPS):每秒钟request/事务 数量



    吞吐率: 是指每秒的处理的请求数量/传输的数据量   

    吞吐量:一个时间段内 处理的请求数量/传输的数据量。

    最大并发数:瞬间最大的并发请求数量(不会timeout)。

    最大并发用户数是指在某一时刻同时向服务器发送请求的用户总数(不会timeout)


    通过不断增加并发用户数和吞吐量观察系统的性能瓶颈。然后,从网络、数据库、应用服务器和代码本身4个环节确定系统的性能瓶颈。


    并发数、QPS、平均响应时间三者之间关系

    系统吞吐量评估方法

    绿色- cpu、mem使用率

    紫色- 成功处理数/秒

    蓝色- 平均耗时

    第一个虚线是 最佳并发数,第二个虚线是最高并发数


    二、软件性能的几个主要术语

    1、响应时间:对请求作出响应所需要的时间

    网络传输时间:N1+N2+N3+N4

    应用服务器处理时间:A1+A3

    数据库服务器处理时间:A2

    响应时间=N1+N2+N3+N4+A1+A3+A2

    2、并发用户数的计算公式

    系统用户数:系统额定的用户数量,如一个OA系统,可能使用该系统的用户总数是5000个,那么这个数量,就是系统用户数。

    同时在线用户数:在一定的时间范围内,最大的同时在线用户数量。
    同时在线用户数=每秒请求数RPS(吞吐量)+并发连接数+平均用户思考时间

    平均并发用户数的计算:C=nL / T

    其中C是平均的并发用户数,n是平均每天访问用户数(login session),L是一天内用户从登录到退出的平均时间(login session的平均时间),T是考察时间长度(一天内多长时间有用户使用系统)

    并发用户数峰值计算:C^约等于C + 3*根号C

    其中C^是并发用户峰值,C是平均并发用户数,该公式遵循泊松分布理论。

    即:

    并发用户为      平均每天用户数  *   平均每个用户操作的时间   除以   一天系统被使用的总时间  

    3、吞吐量的计算公式

    指单位时间内系统处理用户的请求数

    从业务角度看,吞吐量可以用:请求数/秒、页面数/秒、人数/天或处理业务数/小时等单位来衡量

    从网络角度看,吞吐量可以用:字节/秒来衡量

    对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,他能够说明系统的负载能力

    以不同方式表达的吞吐量可以说明不同层次的问题,例如,以字节数/秒方式可以表示数要受网络基础设施、服务器架构、应用服务器制约等方面的瓶颈;已请求数/秒的方式表示主要是受应用服务器和应用代码的制约体现出的瓶颈。

    当没有遇到性能瓶颈的时候,吞吐量与虚拟用户数之间存在一定的联系,可以采用以下公式计算:F=VU * R /

    其中F为吞吐量,VU表示虚拟用户个数,R表示每个虚拟用户发出的请求数,T表示性能测试所用的时间

    4、性能计数器

    是描述服务器或操作系统性能的一些数据指标,如使用内存数、进程时间,在性能测试中发挥着“监控和分析”的作用,尤其是在分析统统可扩展性、进行新能瓶颈定位时有着非常关键的作用。

    资源利用率:指系统各种资源的使用情况,如cpu占用率为68%,内存占用率为55%,一般使用“资源实际使用/总的资源可用量”形成资源利用率。

    5、思考时间的计算公式

    Think Time,从业务角度来看,这个时间指用户进行操作时每个请求之间的时间间隔,而在做新能测试时,为了模拟这样的时间间隔,引入了思考时间这个概念,来更加真实的模拟用户的操作。

    在吞吐量这个公式中F=VU * R / T说明吞吐量F是VU数量、每个用户发出的请求数R和时间T的函数,而其中的R又可以用时间T和用户思考时间TS来计算:R = T / TS

    下面给出一个计算思考时间的一般步骤:

    A、首先计算出系统的并发用户数

    C=nL / T F=R×C

    B、统计出系统平均的吞吐量

    F=VU * R / T R×C = VU * R / T

    C、统计出平均每个用户发出的请求数量

    R=u*C*T/VU

    D、根据公式计算出思考时间

    TS=T/R

    tomcat 高并发配置 与优化

    公司的一个服务器使用Tomcat6默认配置,在后台一阵全点击服务器就报废了,查了一下就要是PERMSIZE默认值过小造成(16-64)

    TOMCAT_HOME/bin/catalina.sh

    添加一行:JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"

    问题解决(可能为调用JAR包过多原因)下面是网上看到一些设置

    JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

     

    当在对其进行并发测试时,基本上30个USER上去就当机了,还要修改默认连接数设置:以下红色四行TOMCAT6中好相没有,手工加上就可以了,基本上可以解决连接数过大引起的死机。具体数值可跟据实际情况设置

        <Connector port="80" protocol="HTTP/1.1" 
                   maxThreads="600"      
    minSpareThreads="100"
    maxSpareThreads="500"
    acceptCount="700"
    connectionTimeout="20000" 
    redirectPort="8443" />

     

    这样设置以后,基本上没有再当机过。。。。。

                  maxThreads="600"       ///最大线程数
    minSpareThreads="100"///初始化时创建的线程数
    maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要
    的socket线程。

    acceptCount="700"//指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

    一、Tomcat的JVM提示内存溢出

    查看%TOMCAT_HOME%\logs文件夹下,日志文件是否有内存溢出错误

    二、修改Tomcat的JVM

    1、错误提示:java.lang.OutOfMemoryError: Java heap space

    Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误,Out of Memory(系统内存不足)的异常,从而导致客户端显示500错误,一般调整Tomcat的使用内存即可解决此问题。 

    Windows环境下修改“%TOMCAT_HOME%\bin\catalina.bat”文件,在文件开头增加如下设置:set JAVA_OPTS=-Xms256m -Xmx512m 

    Linux环境下修改“%TOMCAT_HOME%\bin\catalina.sh”文件,在文件开头增加如下设置:JAVA_OPTS=’-Xms256m -Xmx512m’ 

    其中,-Xms设置初始化内存大小,-Xmx设置可以使用的最大内存。

    2、错误提示:java.lang.OutOfMemoryError: PermGen space

    原因:
    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存
    放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的
    Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用
    中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的
    时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信
    息了。
    解决方法:

    在catalina.bat的第一行增加:
    set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -
    XX:MaxPermSize=256m
    在catalina.sh的第一行增加:
    JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -
    XX:MaxPermSize=256m


    3、JVM设置

    堆的尺寸 
    -Xmssize in bytes 
        设定Java堆的初始尺寸,缺省尺寸是2097152 (2MB)。这个值必须是1024个字节(1KB)的倍数,且比它大。(-server选项把缺省尺寸增加到32M。) 
    -Xmnsize in bytes 
        为Eden对象设定初始Java堆的大小,缺省值为640K。(-server选项把缺省尺寸增加到2M。) 
    -Xmxsize in bytes 
        设定Java堆的最大尺寸,缺省值为64M,(-server选项把缺省尺寸增加到128M。) 最大的堆尺寸达到将近2GB(2048MB)。 

    请注意:很多垃圾收集器的选项依赖于堆大小的设定。请在微调垃圾收集器使用内存空间的方式之前,确认是否已经正确设定了堆的尺寸。 

    垃圾收集:内存的使用 
    -XX:MinHeapFreeRatio=percentage as a whole number 
        修改垃圾回收之后堆中可用内存的最小百分比,缺省值是40。如果垃圾回收后至少还有40%的堆内存没有被释放,则系统将增加堆的尺寸。 
    -XX:MaxHeapFreeRatio=percentage as a whole number 
        改变垃圾回收之后和堆内存缩小之前可用堆内存的最大百分比,缺省值为70。这意味着如果在垃圾回收之后还有大于70%的堆内存,则系统就会减少堆的尺寸。 
    -XX:NewSize=size in bytes 
        为已分配内存的对象中的Eden代设置缺省的内存尺寸。它的缺省值是640K。(-server选项把缺省尺寸增加到2M。) 
    -XX:MaxNewSize=size in bytes 
        允许您改变初期对象空间的上限,新建对象所需的内存就是从这个空间中分配来的,这个选项的缺省值是640K。(-server选项把缺省尺寸增加到2M。) 
    -XX:NewRatio=value 
        改变新旧空间的尺寸比例,这个比例的缺省值是8,意思是新空间的尺寸是旧空间的1/8。 
    -XX:SurvivorRatio=number 
        改变Eden对象空间和残存空间的尺寸比例,这个比例的缺省值是10,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍。 
    -XX:TargetSurvivorRatio=percentage 
        设定您所期望的空间提取后被使用的残存空间的百分比,缺省值是50。 
    -XX:MaxPermSize=size in MB 
        长久代(permanent generation)的尺寸,缺省值为32(32MB)。

    三、查看Tomcat的JVM内存

    1. Tomcat6中没有设置任何默认用户,因而需要手动往Tomcat6的conf文件夹下的tomcat-users.xml文件中添加用户。

     

        如:<role rolename="manager"/>
              <user username="tomcat" password="tomcat" roles="manager"/>

        注:添加完需要重启Tomcat6。

     

    2. 访问http://localhost:8080/manager/status,输入上面添加的用户名和密码。

     

    3. 然后在如下面的JVM下可以看到内存的使用情况。

    四、Tomcat连接数设置

    在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有:
    minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10
    maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75
    acceptCount:允许的最大连接数,应大于等于maxProcessors,默认值为100
    enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false
    connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

    其中和最大连接数相关的参数为maxProcessors和acceptCount。如果要加大并发连接数,应同时加大这两个参数。

     

     

    提高Tomcat的并发能力一些方法
    1、Apache + Tomcat 结合起来用Apache 负责静态页面,Tomcat负责动态页面,同时减少connectionTimeout的时间,以应对并发量大线程回收来不及的情况。
    2、压力过大的问题,可以做负载均衡,一个TOMCAT无论如何也不可能担当如此多的线程负载,而且JVM过大,其内存管理成本将显著加大。2G的内存,做3-4个TOMCAT实例(512RAM*4),更为科学合理。
    3、数据库连接池,不少人,都推荐使用C3P0,能提高访问数据库的并发性能好几倍。(有博文称使用tomcat自带的jdbc-pool更好,还没试过)
    4、采用Tomcat集群可以最大程度的发挥服务器的性能,可以在配置较高的服务器上部署多个Tomcat,也可以在多台服务器上分别部署 Tomcat,Apache和Tomcat整合的方式还是JK方式。经过验证,系统对大用户量使用的响应方面,Apache+3Tomccat集群> Apache+2Tomcat集群> Apache集成Tomcat >单个Tomcat。并且采用Apache+多Tomcat集群的部署方式时,如果一个Tomcat出现宕机,系统可以继续使用,所以在硬件系统性能足够优越的情况下,需要尽量发挥软件的性能,可以采用增加Tomcat集群的方式。
    5. 打开KeepAlive支持
    KeepAlive on, KeepAliveTimeout 15 MaxKeepAliveRequests 1000
    根据实际经验,通过Apache和Tomcat集群的方式提高系统性能的效果十分明显,这种方式可以最大化的利用硬件资源,通过多个Tomcat的处理来分担单Tomcat时的压力。
    web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右

    omcat运行在JVM之上,它和HTTP服务器一样,绑定IP地址并监听TCP端口,同时还包含以下指责:
    • 管理Servlet程序的生命周期
    • 将URL映射到指定的Servlet进行处理
    • 与Servlet程序合作处理HTTP请求——根据HTTP请求生成HttpServletResponse对象并传递给Servlet进行处理,将Servlet中的HttpServletResponse对象生成的内容返回给浏览器

    虽然Tomcat也可以认为是HTTP服务器,但通常它仍然会和Nginx配合在一起使用:
    • 动静态资源分离——运用Nginx的反向代理功能分发请求:所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。
    • 负载均衡,当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理
    • 一、linux系统支持的最大进程数

             限制1:既然系统使用pid_t表示进程号,那么最大进程数不能超过pid_t类型的最大值吧

             限制2:使用命令ulimit -u查看系统中限制的最大进程数,我的机器上是65535。/etc/security/limits.conf里面是硬限制,ulimit -u是软限制,内核参数kernel.pid_max也做了限制。

             限制3:受系统资源限制,创建一个新进程会消耗系统资源,最主要的就是内存,有人做过测试,在创建6千多个进程时,程序运行得很慢,通过vmstat命令观察,发现swap内存的置入置出很频繁,可以判断是由于内存不足,使用虚拟内存,导致频繁的IO操作,让测试代码变得很慢,所以创建过多进程时,系统的内存是重要衡量的一个方面。

      二、单进程最大线程数

           linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX,这个限制可以在 /usr/include/bits/local_lim.h 中查看,对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源, 这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M。

             可以写一段简单的代码验证最多可以创建多少个线程 

      [cpp] view plain copy
       在CODE上查看代码片派生到我的代码片
      1. int main()  
      2. {  
      3.      int i = 0;  
      4.      pthread_t thread;  
      5.   
      6.      while (1) {  
      7.          if (pthread_create(&thread, NULL, foo, NULL) != 0)  
      8.              return;  
      9.          i ++;  
      10.          printf("i = %d\n", i);  
      11.      }  
      12. }  

      试验显示,在 linuxthreads 上最多可以创建 381 个线程,之后就会返回 EAGAIN
      在 nptl 上最多可以创建 382 个线程,之后就会返回 ENOMEM
      这个值和理论完全相符,因为 32 位 linux 下的进程用户空间是 3G(32位下进程可寻址4G,3G为用户空间,1G为内核空间) 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是实际上代码段和数据段等还要占用一些空间,这个值应该向下取整到 383,再减去主线程,得到 382。
      那为什么 linuxthreads 上还要少一个线程呢?这可太对了,因为 linuxthreads 还需要一个管理线程
      为了突破内存的限制,可以有两种方法
      1) 用 ulimit -s 1024 减小默认的栈大小
      2) 调用 pthread_create 的时候用 pthread_attr_getstacksize 设置一个较小的栈大小
      要注意的是,即使这样的也无法突破 1024 个线程的硬限制,除非重新编译 C 库

      三、 设置连接数,即设置最大文件句柄数量,之前由于kafka连接数过高出现过无法创建新句柄的问题,处理方式为增加最大可打开文件数量。












    展开全文
  • Tomcat中Max-thread配置项对TPS的影响压测指标以及对应含义:image.png压力工具中的线程数和用户数 TPS的关系?Jmeter中线程数即虚拟用户数量;TPS即每秒事务数。在性能测试过程中,TPS 之所以重要,是因为它可以...
  • 8.5.5 开启新线程执行类的重新载入 56 8.6 WebappClassLoader类 57 8.6.1 类缓存 58 8.6.2 载入类 59 8.6.3 应用程序 59 第9章 session管理 62 9.1 概述 62 9.2 Sessions 62 9.2.1 Session接口 62 9.2.2 ...
  • Java-Interview-Offer-源码

    2021-03-11 07:16:53
    WEB服务器Tomcat 小服务程序 Cookie和会议 筛选器和监听器 国际化 文件上传下载 阶段三:JavaEE主流框架 春天 行动计划 国际奥委会 事物 SpringMVC 运行原理 数据绑定 MyBatis 缓存机制 运行原理 JPA 注解 映射 ...
  • java面试题

    2018-01-01 15:35:15
    21. EJB与JAVA BEAN的区别? 13 22. Static Nested Class 和 Inner Class的不同。 13 23. JSP中动态INCLUDE与静态INCLUDE的区别? 14 24. List, Set, Map区别 14 25. 集合类都有哪些?主要方法? 14 26. 简述逻辑...
  • how-tomcat-works

    2011-06-30 13:09:09
    8.5.5 开启新线程执行类的重新载入 56 8.6 WebappClassLoader类 57 8.6.1 类缓存 58 8.6.2 载入类 59 8.6.3 应用程序 59 第9章 session管理 62 9.1 概述 62 9.2 Sessions 62 9.2.1 Session接口 62 9.2.2 ...
  • 此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习开发上. 第1部分 xml篇. 第1章 xml...
  • 此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习开发上. 第1部分 xml篇. 第1章 xml...
  • 此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习开发上. 第1部分 xml篇. 第1章 xml...
  • 此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习开发上. 第1部分 xml篇. 第1章 xml...
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    23. EJB与JAVA BEAN的区别? 21 24. Static Nested Class 和 Inner Class的不同。 22 25. 什么时候用assert。 22 26. 启动一个线程是用run()还是start()? 22 27. EJB包括(SessionBean,EntityBean)说出他们的生命...
  • 什么是并发tcp/ip连接套接字通道什么是最大并发有多少tcp/ip 连接如何测试并发线程关系服务器端阻塞和非阻塞1.阻塞慢 一个一个的处理 //tomcat2.非阻塞快 同时处理单线程和多线程1.单线程优点 速度快 空间少...
  • java初学者必看

    热门讨论 2012-02-24 16:07:34
    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...
  • java 面试题 总结

    2009-09-16 08:45:34
    20、EJB与JAVA BEAN的区别? Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有...
  • java面试宝典2012

    2012-12-16 20:43:41
    53、线程的基本概念、线程的基本状态以及状态之间的关系 37 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 38 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
  • 达内java培训目录

    2016-02-06 01:03:30
    JavaSE核心 异常处理、多线程基础、IO系统、网络编程、Java反射机制、JVM性能调优(JVM内存结构剖析、GC分析及调优、JVM内存参数优化)、Java泛型、JDK新特性 熟练掌握JavaSE核心内容,特别是IO和多线程;...
  • JAVA面试宝典2010

    2011-12-20 16:13:24
    53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
  • 9、线程currentThread()interrupt()方法的使用 59 10、线程状态 59 启动线程的方式?start or run? 59 11、什么是java序列化,如何实现java序列化? 59 12、编写一个程序,将d:\java目录下的所有.java文件复制到d:...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    53、线程的基本概念、线程的基本状态以及状态之间的关系 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 ...
  • Java面试宝典-经典

    2015-03-28 21:44:36
    53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
  • Java经典应用编程150例

    热门讨论 2009-12-28 23:34:45
    实例125 使用线程与定时 478 实例126 J2ME绘图 480 实例127 基于J2ME的小游戏 483 实例128 建立无线HTTP连接 485 实例129 收发短信 487 实例130 获取基金报价 490 第12章 JNI编程 493 实例131 简单的JNI调用 494 ...
  • java基础题 很全面

    2009-05-09 09:24:24
    1. EJB与JAVA BEAN的区别? 20 2. EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 20 3. EJB的角色和三个对象 21 4. EJB容器提供的服务 21 5. EJB规范规定EJB中...
  • Java面试宝典2012版

    2012-12-03 21:57:42
    53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
  • Java面试宝典2012新版

    2012-06-26 19:20:00
    53、线程的基本概念、线程的基本状态以及状态之间的关系 34 54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序...
  • JProbe在简单易用的集成化套件中,为servlet、JSP和EJB应用代码提供了强大的Java性能分析、内存纠错、代码覆盖及线程分析功能。 JProbe Profiler JProbe Profiler * JProbe Profiler JProbe Profiler内置了Call ...

空空如也

空空如也

1 2 3 4
收藏数 80
精华内容 32
关键字:

tomcat线程与java线程关系

java 订阅